簡體   English   中英

c++ 中的 Inheritance:析構函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM