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
- 1. 受保護的構造函數與純虛析構函數
- 2. 有沒有用於使受保護的析構函數虛擬?
- 3. 受保護的內部構造函數
- 4. 受保護的抽象基類的構造函數和析構函數?
- 5. 受保護的和私有的方法
- 6. C++調用通用基類的私有/受保護函數
- 7. 接口不能聲明私有/受保護的函數
- 8. 序列圖中的私有/受保護函數
- 9. boost :: python受保護的析構函數問題
- 10. 使用受保護的析構函數刪除對象
- 11. Ruby中的私有/受保護塊?
- 12. 保持API調用私有/受保護
- 13. C++結構中的私有和受保護的可用性
- 14. Castle.Windsor:具有空的受保護構造函數的解析類型
- 15. 使用make_shared與受保護的構造函數+抽象接口
- 16. 受保護的構造函數 - 不顯示與GetConstructors()
- 17. 使用std :: shared_ptr的一個受保護的構造\析構函數
- 18. 具有受保護構造函數的單例類
- 19. 受保護/私有繼承鑄造
- 20. C++類(公共,私有和受保護)
- 21. 訪問受保護或私有屬性
- 22. 有關抽象類與私人,公共和受保護的構造函數的一些問題
- 23. 實現文件中的實例變量 - 私有與受保護
- 24. 需要確保構造函數/析構函數被調用一次。但「錯誤:析構函數是私有的」
- 25. 私人和受保護的純虛函數之間是否有區別?
- 26. 確保私有/受保護方法的輸入?
- 27. C中的繼承樹和受保護的構造函數#
- 28. 關於受保護的構造函數的查詢
- 29. 使用受保護的構造函數的C++常量實例?
- 30. Scala中的受保護函數
你會從私人析構函數派生類的一些問題=) – 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