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

16

我正试图完成一个之前的问题描述的相同任务:

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;  

}

更新:

感谢Naveen。

他给了我一个页面,其中包含有关此主题的所有相关信息。

我会在这里提供链接:

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


你能展示一些表现出这种行为的示例代码吗? - jtbandes
4个回答

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

4

它将会调用 Base::g()。请参考这个FAQ获取解释。


1

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

当调用派生类构造函数时,如果存在派生类覆盖,调用虚函数将调用该覆盖。


1

虚拟机制在构造函数中不起作用,因此,即使从基类构造函数调用虚拟函数,您始终会调用基类函数。以下是虚拟函数在构造函数中不起作用的几个原因:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接