【问题标题】:Calling virtual function of derived class from base class constructor?从基类构造函数调用派生类的虚函数?
【发布时间】:2011-09-27 12:48:16
【问题描述】:

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

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;  

}

更新:

感谢纳文。

他为我提供了一个页面,其中包含有关该主题的所有相关信息。

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

parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.6

【问题讨论】:

  • 你能展示一些表现出这种行为的示例代码吗?

标签: c++


【解决方案1】:

它将Base::g()。请参阅此FAQ 以获得解释。

【讨论】:

    【解决方案2】:

    当你的基类构造函数被调用时,只设置了基类的虚表,所以任何虚函数调用都只适用于基类方法。

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

    【讨论】:

      【解决方案3】:

      尽管它是一个虚函数,但由于派生类尚未完全构造,因此会调用基类的版本。基类构造函数在派生类构造函数之前被调用,因此如果派生虚函数被调用,它会带有一个未完全初始化的实例——可能(可能)导致灾难。

      【讨论】:

      • 谢谢。这个解释说服了我。
      【解决方案4】:

      虚机制在构造函数中不起作用,所以如果你从基类构造函数调用虚函数,你最终只会调用基类的函数。虚函数在 ctor 中不起作用的原因有几个:

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

      【讨论】:

        猜你喜欢
        • 2019-04-19
        • 2016-07-19
        • 2018-07-21
        • 2018-07-16
        • 1970-01-01
        • 2011-05-03
        • 2015-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多