我有三個類。調用抽象類的析構函數
class Son : public Father;
class Father : public Grandfather;
Father
是抽象的,所以是Grandfather
。 Son
不是抽象的。
如果我這樣做:
Son* son = new Son();
,然後做到這一點:
delete(son)
我如何確保的Father
和Grandfather
的析構函數叫什麼名字?
我有三個類。調用抽象類的析構函數
class Son : public Father;
class Father : public Grandfather;
Father
是抽象的,所以是Grandfather
。 Son
不是抽象的。
如果我這樣做:
Son* son = new Son();
,然後做到這一點:
delete(son)
我如何確保的Father
和Grandfather
的析構函數叫什麼名字?
無論你的指針的父類的析構函數都會被調用。
儘管你應該使頂層類的析構函數virtual
,所以你可以刪除一個指向Grandfather
的指針,並確保所有的子類的析構函數也被調用。不這樣做會導致未定義的行爲,這總是一件壞事。
一旦函數爲virtual
,它將對整個派生樹是虛擬的,不需要在子類中標記它。但是,這樣做通常是很好的形式,它可以幫助人們閱讀代碼。
如果它不是虛擬的,問題不是調用派生類型的析構函數;這是行爲是不確定的。語言定義不會告訴你當你這樣做時會發生什麼。 –
@Collin It ** IS **必須在子類中標記爲虛擬的,以便該子類中的方法是虛擬的。 – user1610015
@ 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
只要它們具有虛擬析構函數,那就可以。 – chris
@chris如果你正在刪除一個指向最派生類的指針,你甚至不需要這個。 – Collin
@chris,全部三個班級? –