[英]Inheritance in c++ : destructors
我在每個派生的 class 使用的抽象基礎 class 中添加了一個受保護的成員數組,如果基礎 class 的析構函數是虛擬的,或者我可以這樣做:
**~base(){
delete[] array;
}**
兩個都!
您可以為基礎析構函數提供定義(即使它是純虛擬的),並且如果基礎是資源所在的位置。 那么基地就是應該清理的地方。
或者,給自己一個漂亮的std::vector
,這樣一切都為你完成。
我在每個派生的 class 使用的抽象基礎 class中添加了一個受保護的成員數組,基礎 class 的析構函數是否應該是虛擬的
是的。
當您使用多態性時,析構函數也應該是虛擬的。
有官方指南:
CppCoreGuidelines/CppCoreGuidelines.md at master · isocpp/CppCoreGuidelines · GitHub
C.127:具有虛擬 function 的 class 應該具有虛擬或受保護的析構函數
原因帶有虛擬 function 的 class 通常(並且通常)通過指向基址的指針使用。 通常,最后一個用戶必須在指向基址的指針上調用 delete,通常是通過指向基址的智能指針,因此析構函數應該是公共的和虛擬的。 不太常見的是,如果不支持通過指向基址的指針進行刪除,則析構函數應該是受保護的並且是非虛擬的; 見C.35 。
例子,不好筆記struct B { virtual int f() = 0; //... no user-written destructor, defaults to public non-virtual... }; // bad: derived from a class without a virtual destructor struct D: B { string s {"default"}; }; void use() { unique_ptr<B> p = make_unique<D>(); //... } // undefined behavior, might call B::~B only and leak the string
有些人不遵守此規則,因為他們計划僅通過
執法shared_ptr
使用 class :std::shared_ptr<B> p = std::make_shared<D>(args);
在這里,共享指針將負責刪除,因此不會因對基的不適當delete
而發生泄漏。 一直這樣做的人可能會得到誤報,但規則很重要——如果使用make_unique
分配一個怎么辦? 除非B
的作者確保它永遠不會被濫用,否則它是不安全的,例如通過將所有構造函數設為私有並提供工廠 function 來強制使用make_shared
進行分配。
- 具有任何虛函數的 class 應具有公共和虛擬或受保護和非虛擬的析構函數。
- 使用虛擬 function 但沒有虛擬析構函數的 class 的標志
delete
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.