0 / 0 / 1
Регистрация: 01.11.2011
Сообщений: 26
|
||||||||||||||||
1 | ||||||||||||||||
Наследование и виртуальные функции19.09.2013, 14:50. Показов 2688. Ответов 8
Метки нет (Все метки)
Доброго времени суток. Есть два вопроса:
1) Подскажите, плиз, что делаю не так. Есть базовый класс human и класс наследник solder. Если вызывать методы setName и setAge из наследника solder, то они не будут работать. Почему?
My name is Alex. My age is 25 I am solder! My name is and my age is 0 2) В классе наследнике функция information() перегружается и в итоге имеем другой результат для класса наследника. В чем тогда отличие между таким способом изменения результата в наследнике и если бы функция information() была объявлена как virtual в классе human и в наследнике была бы переопределена?
0
|
19.09.2013, 14:50 | |
Ответы с готовыми решениями:
8
Наследование и виртуальные функции Виртуальные функции и наследование Наследование и виртуальные функции Наследование и виртуальные функции |
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
|
|||||||||||
19.09.2013, 15:02 | 2 | ||||||||||
потому что вы не объявили их виртуальными
здесь:
0
|
250 / 232 / 46
Регистрация: 05.02.2010
Сообщений: 3,288
|
|
19.09.2013, 15:05 | 3 |
конструктор есть где то ?
0
|
0 / 0 / 1
Регистрация: 01.11.2011
Сообщений: 26
|
|
19.09.2013, 15:17 [ТС] | 4 |
А чтобы использовать функции setName() и setAge() для класса наследника, то нужно их тоже объявить виртуальными и переопределить в наследнике?
0
|
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
|
||||||
19.09.2013, 15:28 | 5 | |||||
В Вашем конкретном примере путаница вызвана тем, что в производном классе есть такие же данные члены, к которым в обращаетесь в information().
Имхо, дублирование данных лишнее, нужно просто убрать данные из производного класса и всё. если вы собираетесь их переопределять и/или использовать указатель на базовый класс, инициализированный указателем на производный класс, то функции нужно сделать виртуальными
0
|
0 / 0 / 1
Регистрация: 01.11.2011
Сообщений: 26
|
|
19.09.2013, 15:39 [ТС] | 6 |
Но мне не нужно переопределять эти два метода в производном классе, мне просто нужно их вызвать для производного класса и записать данные в него из ivan->SetName("...") и ivan->SetAge(...). Это можно как-то сделать используя унаследованные функции?
Если убрать данные для производного класса, то компилятор будет ругаться, что данные для базового класса являются скрытыми.
0
|
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
|
||||||
19.09.2013, 17:52 | 7 | |||||
Ваши унаследованные функции работают с данными членами базового (наследуемого) класса.
Чтобы компилятор не ругался, нужно в классе human данные члены объявить в разделе protected
1
|
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
|
|||||||||||
24.09.2013, 14:50 | 8 | ||||||||||
Как я уже сказал, если бы инициализировали указатель на human (базовый) указателем на soldier (производный).
+ ещё пример использования виртуальных функция из вики:
wiki: Виртуальные методы
1
|
0 / 0 / 1
Регистрация: 01.11.2011
Сообщений: 26
|
|
24.09.2013, 15:32 [ТС] | 9 |
Спасибо
0
|
24.09.2013, 15:32 | |
24.09.2013, 15:32 | |
Помогаю со студенческими работами здесь
9
Наследование и виртуальные функции Наследование и виртуальные функции Наследование. Виртуальные функции Наследование и виртуальные функции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |