Вызов функции при наследовании с++

Всем здравствуйте. Я сейчас изучаю 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? Значит, связывание динамическое, получаем указатель, смотрим по указателю в таблицу виртуальных функций, ищем нужную, вызываем...
→ Ссылка