在有关calling virtual methods in ctors and dtors的问题中,从C++标准引用了以下源代码:
struct V {
virtual void f();
virtual void g();
};
struct A : virtual V {
virtual void f();
};
struct B : virtual V {
virtual void g();
B(V*, A*);
};
struct D : A, B {
virtual void f();
virtual void g();
D() : B((A*)this, this) { }
};
B::B(V* v, A* a) {
f(); // calls V::f, not A::f
g(); // calls B::g, not D::g
v->g(); // v is base of B, the call is well-defined, calls B::g
// *** This line ***
a->f(); // undefined behavior, a’s type not a base of B
// *****************
}
我的问题是:为什么在B的ctor中调用
a->f()
是未定义的行为?我们可以放心地假设a
在传递给B的ctor之前已经被分配了,那为什么不能正常工作呢?V * v = new V();
A * a = new A();
B * b = new B(v, a);
最佳答案
创建类型a->f()
的对象时,D
调用是未定义的。
在您自己的示例中,a->f()
没问题,因为在创建A
实例之前已创建了单独的B
实例。
关于c++ - 在ctor中调用其他类的虚拟方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18458000/