我正在尝试完成上一个问题中描述的相同内容:
virtual function call from base class
但是,我真正的问题是:
如果f()是Base类中的构造函数,该怎么办?将调用哪个g()?我不知道我做错了,但在我的计划中,似乎是相反的。
从前一个问题中获取相同的变量,显示这样的代码
行为看起来像这样:
Class Base
{
Base(){g();};
virtual void g(){//Do some Base related code;}
};
Class Derived : public Base
{
Derived(){};
virtual void g(){//Do some Derived related code};
};
int main()
{
Derived newDerived;
return 0;
}
更新
Thanx对Naveen。
他向我提供了一个页面,其中包含有关此主题的所有相关信息。
我会通知你这里的链接:
parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.6
答案 0 :(得分:23)
即使它是一个虚函数,基类的版本也会被调用,因为派生类还没有完全构造。在派生类构造函数之前调用基类构造函数,因此如果要调用派生的虚函数,它将使用未完全初始化的实例 - 可能的(可能)灾难配方。
答案 1 :(得分:4)
它将Base::g()
。有关说明,请参阅此FAQ。
答案 2 :(得分:1)
调用基类构造函数时,只设置基类的vtable,因此任何虚函数调用都只适用于基类方法。
当调用派生类构造函数时,调用虚函数将调用派生类覆盖(如果有)。
答案 3 :(得分:1)
虚拟机制在构造函数中不起作用,因此如果从基类构造函数中调用虚函数,则总是最终只调用基类的函数。虚拟函数在ctors中不起作用的原因有几个: