为什么我的虚方法没有被覆盖?

时间:2010-12-10 01:53:45

标签: c++ override

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 个答案:

答案 0 :(得分:4)

当您在基类构造函数中调用fun()时,尚未构造派生类(在C ++中,首先将构造的父类分类),因此系统还没有Derived的实例,因此没有Derived::fun()的虚函数表中的条目。

这就是为什么对构造函数中的虚函数的调用通常不赞成的原因,除非你具体想要调用虚函数的实现,该虚函数是当前实例化的对象的一部分或者是一部分的虚函数的一部分它的祖先。

答案 1 :(得分:2)

因为你这样写了......你对派生类构造函数的调用确实:

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

更多详情here