Вызов функции при наследовании с++
Всем здравствуйте. Я сейчас изучаю virtual функции и у меня возник вопрос. У меня имеется 2 класса:
class Parent
{
public:
void say()
{
cout << "I am Parent" << endl;
}
};
class Child : public Parent
{
void say()
{
cout << "I am Child" << endl;
}
};
И теперь я сделаю вот так:
int main()
{
Parent* pParent = new Child ();
pParent->say();
}
На вывод получаю:
I am Parent
Так вот вопрос: почему вызывается функция класса-родителя, когда по всей логике должна вызываться функция класса-наследника. Неужели компилятор не видит, что через -> мы вызываем именно метод у класса наследника, объект которого лежит по указателю. Да я знаю, что для решения этой проблемы существует virtual. Но для чего вся эта канитель?
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Для чего канитель? для эффективности, например :) - чтоб не рыться во время работы в таблице виртуальных функций.
- Функция не
virtual? Значит, связывание статическое, исходя из типа объекта времени компиляции -Parent. - Функция
virtual? Значит, связывание динамическое, получаем указатель, смотрим по указателю в таблицу виртуальных функций, ищем нужную, вызываем...