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

Calling virtual function of derived class from base class constructor?

本文关键字:虚拟 函数 派生 函数调用 基类      更新时间:2023-10-16

我正在努力实现上一个问题中描述的目标:

来自基类的虚拟函数调用

但是,我真正的问题是:

如果f((是基类中的构造函数呢?将调用哪个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;  
}

更新:

感谢纳文。

他给了我一个页面,里面有关于这个话题的所有相关信息。

我会让你知道这里的链接:

parashift.com/c++-faq-lite/奇异继承.html#faq-23.6

即使它是一个虚拟函数,由于派生类还没有完全构造好,也会调用基的版本。基类构造函数在派生类构造函数之前被调用,因此如果要调用派生的虚拟函数,它将带有一个未完全初始化的实例,这可能(可能(会导致灾难。

它将Base::g()。有关解释,请参阅此常见问题解答。

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

当调用派生类构造函数时,调用虚拟函数将调用派生类重写(如果有的话(。

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

  1. 在构造函数中,对象尚未完全创建
  2. ctors调用仅在编译时解析,因此它们实际上没有任何运行时依赖关系,因此不使用虚拟函数
  3. 与其他函数不同,actor和dtor不是继承的,所以每个类都有自己的一组actor和dt,所以没有重写的机会