2013-08-27 82 views

回答

2

如果你知道規則是安全的,而規則說在析構函數中,對象的動態類型是析構函數正在執行的類。

雖然B::~B()執行時,該對象的類型是B(如果你打電話f()那麼,你會得到儘管A::~A()正在執行分派到B::f()

,對象的類型爲A,如果調用f()然後,將得到每第10.4節[class.abstract]/6

成員函數可以被稱爲不確定的行爲從抽象類的構造(或析構函數);製作一個虛擬呼叫的效果一個純虛函數直接TLY或間接爲對象被從這樣的構造(或析構函數)創建(或破壞)是未定義

或者,作爲鐺++報告它,

test.cc:5:20: warning: call to pure virtual member function 'f'; overrides of 'f' in subclasses are not available in the destructor of 'A' 
    virtual ~A() { this->f(); } 
       ^
test.cc:7:5: note: 'f' declared here 
    virtual void f() = 0; 
    ^
1 warning generated. 

編輯:OP編輯純虛那麼,當A::~A()正在執行時,虛擬調用f()被調度到A::f()

+0

如果爲純虛擬提供了一個主體,那麼它並不是未定義的。 –

+0

我問了一個問題,以確保.. http://stackoverflow.com/questions/18456450/is-it-safe-to-call-a-pure-virtual-function-in-an-abstract-constructor-destructor –

1

注意:OP編輯代碼以刪除純虛擬部分。

隨着你發佈的內容,不,它是不安全的。當您在繼承層次結構中的類的構造函數或析構函數中調用虛函數時,它不像往常一樣調用大多數派生函數,而是調用當前類中定義的函數。

在這種情況下,〜A調用沒有函數體的A :: f(),所以這是一個錯誤。如果你爲A :: f()提供了一個主體(你可以在純粹的虛擬中做到這一點,只是在類定義之外),那麼它就是「安全的」,儘管它是否做到了你想要的是另一回事。