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

yoy*_*oyo 6 c++ overriding

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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

base class
fun of base
derive class
fun of derive
Run Code Online (Sandbox Code Playgroud)

为什么第二行不是fun of derive

Tim*_*sch 4

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

这就是为什么在构造函数中调用虚函数通常不受欢迎的原因,除非您特别想要调用虚函数的实现,该虚函数是当前正在实例化的对象的一部分或其祖先之一的一部分。