C++中的受保護的與私有的析構函數是否有區別?如果基類析構函數是私有的,我想象它在刪除派生類對象時仍然被調用。受保護的與私有的析構函數
回答
採取了構造函數/析構函數聲明爲private,那麼類不能被實例化。
這是真的,但它可以通過類中的其他方法實例化。同樣,如果析構函數是private
,那麼該對象也只能從類內部刪除。此外,它阻止了類的繼承(或者至少阻止繼承類被實例化/銷燬)。
公共類A {私人A(){}公共A getA(){返回新的A(); }} 不完全如此。 – 2010-07-14 13:57:38
這不是事實。具有私有析構函數的對象*可以被實例化(例如,在朋友函數內的堆棧中)。 – SadSido 2010-07-14 13:59:08
權利不能堆棧分配,但可以堆分配,也可以從朋友功能... – 2010-07-14 13:59:27
如果基類析構函數爲private
或protected
,則不能通過基類指針調用delete
。
使用受保護的析構函數來防止通過基類指針破壞派生對象。它將對分離器的訪問限制爲派生類。它可以防止類庫的自動 (堆棧)對象。
實際上它是用來以允許通過指針任何 其他多態性使用衍生 類來的基礎上,但不 允許用戶使用這種 指針進行刪除。示例: - 抽象基類/接口。
但是一個protected
,non-virtual
析構函數似乎是一個等待發生的錯誤。假設你不提供一個destroy()
函數,你最終必須公開這個dtor。一旦你這樣做了,你就無法進一步控制課程,並且如果有人從你的課堂中進一步派生出來,那麼就會冒着使用非虛擬教授多態刪除的風險。
下面的代碼段將會導致編譯器錯誤(VC2010): C2248:「鹼基::〜基地」:不能訪問在類「基地」聲明
class base
{
~base(){}
};
class derived : public base
{
};
int main()
{
derived* d = new derived;
delete d;
}
然而私有成員,如果你改變基礎析構函數來保護,一切正常。
但即使將其更改爲「protected」,也不能通過基類指針銷燬對象。 (在這種情況下,它也應該是'虛擬的',順便說一句)。這有些挫敗了派生的許多目的...... – sbi 2010-07-14 15:22:36
你會從私人析構函數派生類的一些問題=) – SadSido 2010-07-14 13:53:13
Duplicate爲http://stackoverflow.com/questions/631783/what-is-the-use-of-having-destructor-as-private ? – SadSido 2010-07-14 14:00:46
類似的問題在這裏:http://stackoverflow.com/questions/224966/private-and-protected-members-c – Jordan 2010-07-14 14:00:58