2015-11-17 27 views

回答

2

$ 12.7/4構建和破壞[class.cdtor](由我粗體)

成員函數,包括虛擬功能(10.3),可稱爲施工或破壞(12.6.2)中 。當從構造函數或 析構函數直接或間接調用虛函數 時,包括在構造或銷燬類的非靜態數據成員期間以及調用 所應用的對象是對象(稱之爲x)正在建設或銷燬, 被調用的函數是構造函數或 析構函數的類中的最終覆蓋,而不是覆蓋更多派生類中的函數。 如果虛擬函數調用使用的顯式類成員訪問 (5.2.5)和對象表達是指與x 或該對象的基類的子對象中的一個的完整的對象而不是其 基類的子對象的x或一個,行爲是不確定的。 [實施例:

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 
    a->f(); // undefined behavior, a’s type not a base of B 
} 

末端示例]

相關問題