2010-07-14 51 views
24

C++中的受保護的與私有的析構函數是否有區別?如果基類析構函數是私有的,我想象它在刪除派生類對象時仍然被調用。受保護的與私有的析構函數

+4

你會從私人析構函數派生類的一些問題=) – SadSido 2010-07-14 13:53:13

+0

Duplicate爲http://stackoverflow.com/questions/631783/what-is-the-use-of-having-destructor-as-private ? – SadSido 2010-07-14 14:00:46

+1

類似的問題在這裏:http://stackoverflow.com/questions/224966/private-and-protected-members-c – Jordan 2010-07-14 14:00:58

回答

12

here:

採取了構造函數/析構函數聲明爲private,那麼類不能被實例化。

這是真的,但它可以通過類中的其他方法實例化。同樣,如果析構函數是private,那麼該對象也只能從類內部刪除。此外,它阻止了類的繼承(或者至少阻止繼承類被實例化/銷燬)。

+4

公共類A {私人A(){}公共A getA(){返回新的A(); }} 不完全如此。 – 2010-07-14 13:57:38

+2

這不是事實。具有私有析構函數的對象*可以被實例化(例如,在朋友函數內的堆棧中)。 – SadSido 2010-07-14 13:59:08

+2

權利不能堆棧分配,但可以堆分配,也可以從朋友功能... – 2010-07-14 13:59:27

22

如果基類析構函數爲privateprotected,則不能通過基類指針調用delete

使用受保護的析構函數來防止通過基類指針破壞派生對象。它將對分離器的訪問限制爲派生類。它可以防止類庫的自動 (堆棧)對象。

實際上它是用來以允許通過指針任何 其他多態性使用衍生 類來的基礎上,但不 允許用戶使用這種 指針進行刪除。示例: - 抽象基類/接口。

但是一個protected,non-virtual析構函數似乎是一個等待發生的錯誤。假設你不提供一個destroy()函數,你最終必須公開這個dtor。一旦你這樣做了,你就無法進一步控制課程,並且如果有人從你的課堂中進一步派生出來,那麼就會冒着使用非虛擬教授多態刪除的風險。

6

下面的代碼段將會導致編譯器錯誤(VC2010): C2248:「鹼基::〜基地」:不能訪問在類「基地」聲明

class base 
{ 
    ~base(){} 
}; 

class derived : public base 
{ 
}; 

int main() 
{ 
    derived* d = new derived; 

    delete d; 
} 

然而私有成員,如果你改變基礎析構函數來保護,一切正常。

+0

但即使將其更改爲「protected」,也不能通過基類指針銷燬對象。 (在這種情況下,它也應該是'虛擬的',順便說一句)。這有些挫敗了派生的許多目的...... – sbi 2010-07-14 15:22:36

6

答案是你的假設是錯誤的。基類析構函數在私有時無法調用。

+0

那麼我的班級如何被破壞? – doron 2010-07-14 14:38:58

+0

@ deus-ex-machina399:它不能。因此你不能從中得出結論。你不能創建它的自動對象。動態對象永遠不能被刪除(除非你提供了這樣做的成員函數)。 – sbi 2010-07-14 15:20:06

相關問題