Java和C#支持關鍵字final
和sealed
不能用作基類的類的概念。然而,在C++中,沒有什麼好方法可以防止從中派生出類,如果每個類都有虛擬析構函數,是否會讓類的作者左右爲難?每個班級都應該有一個虛擬析構函數嗎?
編輯:由於C++ 11這不再是真實的,你可以指定一個類是final
。
在一方面給予的對象的虛擬析構函數意味着它將具有vtable
和因此消耗4(或8在64臺機器)每個對象的附加字節爲vptr
。
另一方面,如果稍後有人從此類派生並通過指向基類的指針刪除派生類,那麼程序將會不明確(由於沒有虛擬析構函數),並且坦率地針對每個對象的指針是荒謬的。
在gripping hand有一個虛擬析構函數(可以說)宣傳這種類型意味着多態使用。
有些人認爲你需要明確的理由不使用虛擬析構函數(因爲是this question的潛臺詞),有人認爲只有當你有理由相信你的類是從派生的, 你想什麼?
已經有問題要求利弊 - 這是重複的,還是打算作爲民意調查?如果是後者,也許你應該爲投票創建「是」和「否」的答案,那麼結束這個問題呢?我認爲這是對SO執行多項選擇投票的推薦方式。 – 2008-12-09 19:01:55
重複:http://stackoverflow.com/questions/270917/why-should-i-declare-a-virtual-destructor-for-an-abstract-class-in-c,http://stackoverflow.com/questions/300986 /當你不應該使用虛擬破壞者 – 2008-12-09 19:04:22
「並坦率地爲每個對象的指針優化是荒謬的。」 - 它對於小對象並不可笑。 C++ 0x正在添加一個容器forward_list,這正是因爲有時每個對象的開銷太多 - 從空間和時間要求來看。 – 2008-12-09 19:23:55