从基类构造函数调用派生类的虚函数?

时间:2011-07-03 06:23:20

标签: c++

我正在尝试完成上一个问题中描述的相同内容:

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

4 个答案:

答案 0 :(得分:23)

即使它是一个虚函数,基类的版本也会被调用,因为派生类还没有完全构造。在派生类构造函数之前调用基类构造函数,因此如果要调用派生的虚函数,它将使用未完全初始化的实例 - 可能的(可能)灾难配方。

答案 1 :(得分:4)

它将Base::g()。有关说明,请参阅此FAQ

答案 2 :(得分:1)

调用基类构造函数时,只设置基类的vtable,因此任何虚函数调用都只适用于基类方法。

当调用派生类构造函数时,调用虚函数将调用派生类覆盖(如果有)。

答案 3 :(得分:1)

虚拟机制在构造函数中不起作用,因此如果从基类构造函数中调用虚函数,则总是最终只调用基类的函数。虚拟函数在ctors中不起作用的原因有几个:

  1. 虽然在构造函数中没有完全创建对象。
  2. ctors调用仅在编译时解析,因此它们实际上没有任何运行时依赖性,因此不使用虚函数。
  3. 与其他函数不同,ctors和dtors不是继承的,所以每个类都有自己的ctors和dtors,所以没有机会覆盖。