6

ctors および 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
    // *****************
}

私の質問は、なぜa->f()B の ctor を呼び出すことが未定義の動作なのですか? これは B の ctor に渡される前に既に割り当てられていると安全に想定できますがa、なぜそれが正しく機能しないのでしょうか?

V * v = new V();
A * a = new A();
B * b = new B(v, a);
4

1 に答える 1

2

タイプのa->f()オブジェクトを作成する場合、呼び出しは未定義ですD

あなた自身の例では、インスタンスを作成する前にa->f()別のインスタンスを作成しているので、問題ありません。AB

于 2013-08-27T07:15:24.580 に答える