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

50pmv0ei  于 2023-04-08  发布在  其他
关注(0)|答案(4)|浏览(158)

我正在努力实现与上一个问题中描述的相同的目标:
virtual function call from base class
但我真实的的问题是
如果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/strange-inheritance.html#faq-23.6

lbsnaicq

lbsnaicq1#

虽然它是一个虚函数,但基类的版本会被调用,因为派生类还没有完全构造。基类构造函数在派生类构造函数之前被调用,所以如果派生虚函数被调用,它将是一个未完全初始化的示例-这可能(可能)是灾难的原因。

1dkrff03

1dkrff032#

它将Base::g()。请参阅此常见问题解答以获得解释。

zqry0prt

zqry0prt3#

当你的基类构造函数被调用时,只有基类的vtable被设置,所以任何虚函数调用将只应用于基类方法。
当调用派生类构造函数时,调用虚函数将调用派生类重写(如果有)。

gfttwv5a

gfttwv5a4#

虚函数机制在构造函数中不起作用,所以如果你从基类构造函数中调用虚函数,你最终只会调用基类的函数。虚函数在ctors中不起作用的原因有几个:
1.而在构造函数中,对象尚未完全创建。

  1. ctors调用只在编译时解析,因此它们实际上没有任何运行时依赖性,因此不使用虚函数。
    1.与其他函数不同,ctors和dtors不是继承的,因此每个类都有自己的ctors和dtors集,因此没有机会重写。

相关问题