|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
06.07.2010, 03:56 | #1 |
Регистрация: 08.10.2009
Сообщений: 8
|
Наследование
proto.h
Код:
real.cpp Код:
Код:
Последний раз редактировалось Stilet; 06.07.2010 в 08:09. |
06.07.2010, 05:14 | #2 |
Пользователь
Регистрация: 22.04.2010
Сообщений: 96
|
В классе Apple есть функция Set(), она и будет вызываться.
include <Qt>
|
06.07.2010, 06:55 | #3 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
В данном случае виртуальность метода ни на что бы не повлияла. Поведение программы изменится на то, которое Вы ожидали, если изменить код так:
Код:
Если же метод сделать виртуальным, то компилятор сначала проверит на что на самом деле указывает homeapple. Увидит, что это оказывается не Fruit, a Apple и вызовет метод из класса Apple. |
06.07.2010, 07:47 | #4 | |||
Новичок
Джуниор
Регистрация: 04.07.2010
Сообщений: 38
|
Цитата:
Если в потомке создать метод с названием равным методу базового класса, то метод базового класса "затирается". Т.е. он как бы имеет одновременно 2 метода с одинаковыми названиями, потомка и базового класса. Если создать указатель на Родителя, то будет создан прототип на методы родителя, а следовательно и вызов методов родителя. Вот тогда он и вызовется - "затертый" метод. Если создать указатель на потомка, то будет создан прототип потомка и все будет ссылаться на методы потомка, а именно на твой метод, что и вызвался. И зачем вообще создавать метод, если будет использоваться унаследованый метод родителя. 1 вариант Цитата:
Цитата:
Последний раз редактировалось Loji; 06.07.2010 в 07:54. |
|||
06.07.2010, 12:43 | #5 | |
Регистрация: 08.10.2009
Сообщений: 8
|
Цитата:
|
|
06.07.2010, 12:55 | #6 | |
Участник клуба Подтвердите свой е-майл
Регистрация: 19.11.2007
Сообщений: 1,022
|
Цитата:
|
|
06.07.2010, 13:29 | #7 |
Регистрация: 08.10.2009
Сообщений: 8
|
у меня она сейчас в руках. если я задал вопрос, значит, мне кое-что неясно. Прошу не указывать на личностные качества, а отвечать по существу.
|
06.07.2010, 13:48 | #8 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Попробуйте реализовать класс "Корзинка для фруктов", в котором может храниться любое количество фруктов (на основе массива, списка,.. без разницы это). Под каждый фрукт выделим по классу. Пусть это будут классы: Зеленое яблоко, Груша, Мандарин. Ну и у фрукта создадим метод: GetColor, который будет возвращать цвет фрукта (для простоты пусть это будет целое число). Для базового класса это будет 0, для яблока - 1, для груши - 2 и для мандарина - 3. Подумайте как это будет всё работать в зависимости от виртуальности метода GetColor.
Заготовочка: Код:
|
06.07.2010, 16:08 | #9 | |
Новичок
Джуниор
Регистрация: 04.07.2010
Сообщений: 38
|
Цитата:
Если указатель на базовый клас, то он и будет указывать только на унаследованные методы от базового класса ( че ж и придумали такое понятие как interface class ). Но, если один из них определен в потомке как виртуальный, то тогда будет вызван именно метод потомка. В этом и есть суть полиморфизма. У тебя возник вопрос, если можно просто затереть функцию родителя в потомке, то тогда зачем использовать виртуальные функции? А суть в том, что из базового указателя ты ее никак не сможешь вызвать. Иными словами, указатель на потомка будет всегда видеть все твои созданные методы, как виртуальные так нет, абсолютно все. Вопрос лишь стоит в том , будет ли видеть методы потомка указатель на базовый класс. Последний раз редактировалось Loji; 06.07.2010 в 16:46. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Наследование | Сергей089 | Помощь студентам | 6 | 07.02.2010 12:04 |
Наследование | lolopolosko | Помощь студентам | 1 | 21.11.2009 17:17 |
Наследование | beregok | Общие вопросы C/C++ | 1 | 04.07.2009 22:39 |
Наследование | z3rg | Общие вопросы C/C++ | 9 | 30.04.2009 20:43 |
Наследование | Кирилл13 | Общие вопросы C/C++ | 1 | 11.11.2008 14:47 |