我正在努力实现与上一个问题中描述的相同的目标:
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
4条答案
按热度按时间lbsnaicq1#
虽然它是一个虚函数,但基类的版本会被调用,因为派生类还没有完全构造。基类构造函数在派生类构造函数之前被调用,所以如果派生虚函数被调用,它将是一个未完全初始化的示例-这可能(可能)是灾难的原因。
1dkrff032#
它将
Base::g()
。请参阅此常见问题解答以获得解释。zqry0prt3#
当你的基类构造函数被调用时,只有基类的vtable被设置,所以任何虚函数调用将只应用于基类方法。
当调用派生类构造函数时,调用虚函数将调用派生类重写(如果有)。
gfttwv5a4#
虚函数机制在构造函数中不起作用,所以如果你从基类构造函数中调用虚函数,你最终只会调用基类的函数。虚函数在ctors中不起作用的原因有几个:
1.而在构造函数中,对象尚未完全创建。
1.与其他函数不同,ctors和dtors不是继承的,因此每个类都有自己的ctors和dtors集,因此没有机会重写。