Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2015, 15:19   #21
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
это уже называется "наследование"
Полиморфизм через абстракции - частный случай полиморфизма. Реализаций оного полно.
Цитата:
будет именно из класса С, при

ее наличии
Да. Типом вы описываете лишь интерфейс, вызвана, разумеется, будет сама реализация.
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!

Последний раз редактировалось crazy horse; 04.08.2015 в 15:25.
crazy horse вне форума Ответить с цитированием
Старый 04.08.2015, 15:28   #22
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Цитата:
Сообщение от crazy horse Посмотреть сообщение
Полиморфизм через абстракции - частный случай полиморфизма. Реализаций оного полно.
Вы бы сначала на код его посмотрели, потом комментировали.

Код:
class A
{
public:
    void foo()
    {
        printf("A::foo");
    }
};


class B : public A
{
};


int main()
{   
    B* b = new B();
    b->foo();
	return 0;
}
Где Вы тут полиморфизм узрели?
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 04.08.2015, 15:30   #23
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
Вы бы сначала на код его посмотрели, потом комментировали.

Код:
class A
{
public:
    void foo()
    {
        printf("A::foo");
    }
};


class B : public A
{
};


int main()
{   
    B* b = new B();
    b->foo();
	return 0;
}
Где Вы тут полиморфизм узрели?
Тут нигде, согласен, разгребать эти портянки на работе некогда, сорри. Просто дальше посмотрел что он написал, там его и увидел.
С другой стороны нехило было бы цитаты вставлять в комменты подобные, чтобы было понятно, к чему относятся
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!
crazy horse вне форума Ответить с цитированием
Старый 04.08.2015, 16:22   #24
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Helloween полиморфизм был в первом сообщении.

зачем вообще приводить тип производного класса к типу базового ?

А* b = new С; тем самым делать функции виртуальными

С* b = new С; - чем это плохо?
RAFA91 вне форума Ответить с цитированием
Старый 04.08.2015, 16:26   #25
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

Представьте, что у вас есть два класса - наследники класса фигура: круг и квадрат.
У обоих есть свой метод расчета площади. В случае с полиморфизмом - остальному коду пофигу, какую из фигур конкретно вы ему подсунули (предположим, созданную где-то в другом месте). В обоих случаях площадь будет посчитана правильно, а интерфейс - один и тот же. Не ясно, не? Конечно же, можно написать кучу кейсов под обработку каждого конкретного шейпа. Я такое видел часто.
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!
crazy horse вне форума Ответить с цитированием
Старый 04.08.2015, 17:47   #26
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

тоесть в данном случае идет ключевое слово фигура, а полиморфизм

сам в состоянии выяснить что это за фигура ?

типо

Код:
figure *pfigure1 = new round;

figure *pfigure2 = new square;

figure *pfigure3 = pfigure1;

pfigure1 = pfigure2;

pfigure2 = pfigure3;

pfigure1->area(); //вычисление площади квадрата
RAFA91 вне форума Ответить с цитированием
Старый 04.08.2015, 19:02   #27
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

Нет, не в состоянии *он* ничего выяснить. В данном случае, он просто позволяет обращаться к любому типу - наследнику, как к абстрактному базовому типу, оставляя нюансы реализации на плечах последнего. Предположим, у вас есть некий массив фигур. Контейнер. В него может попасть всё, что угодно, но мы знаем, что всё, что туда попадает, в общем случае, реализует абстрактный метод класса shape - area. Нам надо вычислить общую площадь всех фигур в нём. Вместо того, чтобы долго и натужно в рантайме определять, что за конкретная сущность нам попалась, мы тупо берём каждую в цикле как абстрактный тип shape и пинаем известный нам абстрактный метод. Складываем, радуемся. Это, конечно, приянутый за уши пример, но очень наглядный.
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!

Последний раз редактировалось crazy horse; 04.08.2015 в 19:20.
crazy horse вне форума Ответить с цитированием
Старый 05.08.2015, 01:48   #28
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
А* b = new С; тем самым делать функции виртуальными

С* b = new С; - чем это плохо?
Функции виртуальными ты делаешь ключевым словом virtual (а не так как тут пишешь)
Это не плохо, но во многих случаях у многих твоих классов может быть одинаковый интерфейс. Например, юниты в игре могут иметь одинаковый набор методов типа move(), group(), fight(), ... .
Но самих типов юнитов могут быть десятки и ты просто так не сможешь писать
Код:
Knight *knight = new Knight;
Ну просто потому, что это бы означало, что для каждого рыцаря/лекаря/паладина/... , который может быть создан в любых количествах во время игры программист должен бы описать переменную на этапе разработки игры.

И вот так тоже не удобно:
Код:
vector<Knight*> knights;
knights.push_back(new Knight());
Ну потому что тут ты каждый тип объекта пытаешься хранить в отдельном векторе (массиве) и этими векторами будет тяжело управлять при написании программы (ведь их могут быть сотни).

Но вот если ты пишешь:
Код:
vector<Unit*> units;
units.push_back(new Knight());
units.push_back(new Healer());
где Unit - базовый абстрактный класс с методами типа move(), ..., то ты начинаешь использовать полиморфизм. Т.е. методы будут вызываться класса, которому принадлежит объект, а не указатель (если это виртуальные методы).

Там выше было два моих поста, где я описал это все (сначала виртуальные функции, а потом невиртуальные) и мне вот кажется, что если вопрос такой возник, то ты те посты недочитал.
rrrFer вне форума Ответить с цитированием
Старый 05.08.2015, 12:18   #29
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

rrrFer благодарю за четкое разьяснение.

посты про таблицы виртуальных функций я читал.

в принципе с помощью полиморфизма я могу делать перестановку

указателей.

- сначала pfigure1 вызывал метод вычисления площади круга, а потом

площади квадрата;

- сначала pfigure2 вызывал метод вычисления площади квадрата, а потом

площади круга.

Код:
figure *pfigure1 = new round;

pfigure1->area(); //вычисление площади круга

figure *pfigure2 = new square;

pfigure2->area(); //вычисление площади квадрата

figure *pfigure3 = pfigure1;

pfigure1 = pfigure2;

pfigure2 = pfigure3;

pfigure1->area(); //вычисление площади квадрата

pfigure2->area(); //вычисление площади круга
RAFA91 вне форума Ответить с цитированием
Старый 05.08.2015, 12:27   #30
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

Я, честно говоря, уже и не знаю, что вам на это ответить.
Где вы в своем коде полиморфизм увидели?
Наверное, раз читали и не вычитали, бросьте вы это дело с принципами ооп. Не забивайте голову ни себе, ни людям.
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!

Последний раз редактировалось crazy horse; 05.08.2015 в 12:29.
crazy horse вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многоуровневый if/else Bender1000 JavaScript, Ajax 9 04.12.2014 15:48
Многоуровневый нумерованный список Word2010 КарандашТМ Microsoft Office Word 3 13.09.2014 18:29
Многоуровневый список в ворде. NewLamer&Programer Помощь студентам 1 28.06.2013 09:31
многоуровневый комбобокс на основе ExtJS sashonk JavaScript, Ajax 0 02.09.2010 16:58
Многоуровневый заголовок (Delphi) VadEr Помощь студентам 1 02.03.2010 14:54