2012-10-20 68 views
1

我有三個類。調用抽象類的析構函數

class Son : public Father; 

class Father : public Grandfather; 

Father是抽象的,所以是GrandfatherSon不是抽象的。

如果我這樣做:

Son* son = new Son(); 

,然後做到這一點:

delete(son) 

我如何確保的FatherGrandfather的析構函數叫什麼名字?

+1

只要它們具有虛擬析構函數,那就可以。 – chris

+0

@chris如果你正在刪除一個指向最派生類的指針,你甚至不需要這個。 – Collin

+0

@chris,全部三個班級? –

回答

2

無論你的指針的父類的析構函數都會被調用。

儘管你應該使頂層類的析構函數virtual,所以你可以刪除一個指向Grandfather的指針,並確保所有的子類的析構函數也被調用。不這樣做會導致未定義的行爲,這總是一件壞事。

一旦函數爲virtual,它將對整個派生樹是虛擬的,不需要在子類中標記它。但是,這樣做通常是很好的形式,它可以幫助人們閱讀代碼。

+0

如果它不是虛擬的,問題不是調用派生類型的析構函數;這是行爲是不確定的。語言定義不會告訴你當你這樣做時會發生什麼。 –

+0

@Collin It ** IS **必須在子類中標記爲虛擬的,以便該子類中的方法是虛擬的。 – user1610015

+0

@ user1610015嗯..沒有。 Quoth標準:10.3段落2:「如果一個虛擬成員函數vf是在一個Base Base中聲明的,並且派生於Derived,直接或間接地從Base派生的 ,則一個具有相同名稱的成員函數vf,parameter-type-list( 8.3.5),cv-quali fi cation,refquali fi er(或缺少相同)Base :: vf被聲明,那麼Derived :: vf也是虛擬的(不論它是否被聲明)「 – Collin