簡體   English   中英

c++ 中帶有覆蓋的非虛擬析構函數

[英]non-virtual destructors in c++ with override

是的,我已經看到很多關於在 C++ 中使用關鍵字virtualoverride析構函數的帖子。 我也認為我了解用法:

  • 如果基礎 class 具有虛擬析構函數並且派生的 class 覆蓋它,如果簽名不同,程序將由於覆蓋而無法編譯。

但是我想知道 - 或者我在某人的代碼中也多次看到它,它是這樣使用的:

class Base
{
   public:
          ~Base();
};

class Derived : public Base
{
   public:
         ~Derived() override;
};

這是否覆蓋了基礎 class 中非虛擬 function 的析構函數實際上對程序/編譯或任何東西有任何影響? 還是在這種情況下使用不當?

您的代碼無法編譯,因為Base::~Base不是虛擬的。

哦,好吧,也許我已經監督了這一點:如果 Base class 派生自另一個 class,比如 SuperBase class - 它有一個虛擬析構函數,那么 Base 的析構函數是沒有使用關鍵字的 virtual 對嗎?

正確的。 如果基礎 class 中的方法是虛擬的,則子 class 中具有相同名稱和相同簽名的方法也將是隱式虛擬的。 virtual關鍵字可以省略。

一個好的做法是始終在要覆蓋的方法上使用關鍵字override 這有兩個很大的優點:它讓人類讀者清楚地知道該方法是虛擬的並且被覆蓋,並且它避免了一些錯誤,該方法被縮進以覆蓋,但它默默地沒有(例如const不匹配)。

析構函數是一種特殊情況,因為它們會覆蓋父虛擬析構函數,即使它們具有不同的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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