2015-04-03 130 views
0

案例-1:以下哪種情況下需要虛擬析構函數?

基類有一個動態分配的變量,但派生類不然後我做的:

Base* p = new Derived; 
delete p; 

案例-2:

兩個基類和派生類有動態分配的變量(派生有除了那些繼承的附加動態分配的變量)。 同樣,我做的:

Base* p = new Derived; 
delete p; 

案例3: 基類有沒有動態分配的變量,但得到的一個呢。我再次這樣做:

Base* p = new Derived; 
delete p; 

情況-4:鹼基和派生類都沒有任何動態分配的變量。我也是這樣做的:

Base* p = new Derived; 
delete p; 

或者它會在所有情況下導致未定義的行爲,如果虛擬關鍵字被忽略?

+0

你自己做作業和學習東西如何? :-) – Waldheinz 2015-04-03 16:55:31

回答

4

所有這些。

如果delete使用與實際對象不同的指針,編譯器不知道如何正確地執行它,除非析構函數是虛擬的。此時,即使它看起來正常工作,您也會遇到未定義的行爲。

+0

在一般情況下,所有四種情況都是有問題的,但是如果動態分配是唯一的問題,那麼只有情況2和3是有問題的,對嗎? – Waldheinz 2015-04-03 17:01:47

+0

@Waldheinz:未定義的行爲總是令人擔憂,所以動態分配不是唯一的問題。 – 2015-04-03 17:03:12

+0

@MikeSeymour我對C++沒有深入的瞭解,知道這個行爲是不確定的,因爲C++是這樣說的,或者如果可能的話,它確實是安全的。但它總是未定義的,這裏有一些細節:http://stackoverflow.com/questions/6171814/why-is-it-undefined-behavior-to-delete-an-array-of-derived-objects-via-a-基於 – Waldheinz 2015-04-03 17:06:58