2010-12-10 3 views
6
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?

+3

Материал для чтения: [«Никогда не вызывать виртуальные функции во время строительства или уничтожения»] (http://www.artima.com/cppsource/nevercall.html). – 2010-12-10 02:10:49

ответ

4

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

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

2

Потому что ты написал, как ... Ваш призыв к производному конструктор класса делает:

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

Подробнее here

+0

Не виртуальный метод в базовом классе всегда переопределяется производным методом с той же сигнатурой, даже в конструкторе? – yoyo 2010-12-10 02:01:36

Смежные вопросы