Почему мой виртуальный метод не переопределен? - PullRequest
6 голосов
/ 10 декабря 2010
class Base
{
public:
Base()
{
cout<<"base class"<<endl;
fun();
}
virtual void fun(){cout<<"fun of base"<<endl;}
};

class Derive:public Base
{
public:
Derive()
{
cout<<"derive class"<<endl;
fun();
}
void fun(){ cout<<"fun of derive"<<endl;}
};

void main()
{
Derive d;
}

Вывод:

base class
fun of base
derive class
fun of derive

Почему вторая строка не fun of derive?

Ответы [ 2 ]

4 голосов
/ 10 декабря 2010

Когда вы вызываете fun() в конструкторе базового класса, производный класс еще не был создан (в C ++ сначала создаются классы родительского класса), поэтому в системе еще нет экземпляра Derived и, следовательно, нет записи втаблица виртуальных функций для Derived::fun().

Это причина, по которой вызовы виртуальных функций в конструкторах обычно не одобряются, если вы не специально хотите вызвать реализацию виртуальной функции, которая либочасть объекта, который в данный момент создается, или часть одного из его предков.

2 голосов
/ 10 декабря 2010

Поскольку вы написали это так ... Ваш вызов конструктора производного класса делает:

- Base Class Constructor call
   |
   Call to **fun of Base Class**
- Derived Class Constructor call
   |
   Call to **fun of the Derived Class**

Подробнее здесь

...