从基类构造函数调用派生类的虚拟函数
Calling virtual function of derived class from base class constructor?
我正在努力实现上一个问题中描述的目标:
来自基类的虚拟函数调用
但是,我真正的问题是:
如果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中不起作用的原因有几个:
- 在构造函数中,对象尚未完全创建
- ctors调用仅在编译时解析,因此它们实际上没有任何运行时依赖关系,因此不使用虚拟函数
- 与其他函数不同,actor和dtor不是继承的,所以每个类都有自己的一组actor和dt,所以没有重写的机会
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数