我有两个类A
和B
,我需要在B
中覆盖一个函数,以便从A
的构造函数中调用。这是我已经拥有的:
class A {
A(char* str) {
this->foo();
}
virtual void foo(){}
}
class B : public A {
B(char* str) : A(str) {}
void foo(){
//stuff here isn't being called
}
}
如何从B::foo()
{/ 1}} A::A()
中调用代码?
答案 0 :(得分:3)
我认为你指的是在初始化成语期间调用虚拟对象(在初始化期间称为动态绑定),所以请看一下这里解释所有内容:
答案 1 :(得分:3)
我需要在B中覆盖一个从A的构造函数
调用的函数
这种设计在C ++中是不可能的:B对象的order of construction是首先构造基础A子对象,然后在其上构造B。
结果是,在A构造函数中,你仍在构造一个A对象:此时调用的任何虚函数都是A的函数。只有当A构造完成并且B构造开始时,才会B的虚函数变得有效。
为了达到你想要的效果,你必须使用两步模式:1)你构造对象,2)你初始化它。
答案 2 :(得分:1)
在构造函数中,将调用基类的函数,而不是被重写的版本。这样做的原因是,使用您的示例,B
的构造函数被调用时A
的初始化不完整,因此调用B
的{{1}}会如果允许,则使用不完整的foo
实例。