簡體   English   中英

為什么純虛擬析構函數的實現必須為空? 而且應該是內聯的嗎?

[英]Why must a pure virtual destructor's implementation be empty? And should it be inline?

我在其他線程中讀到,當您實現純虛擬析構函數(是的,可以有一個實現)時,它必須為空,並且(?)應該是內聯的。 它應該是空的嗎? 如果是這樣,為什么? 應該是內聯的嗎? 如果是這樣,為什么?

編輯:這是純虛擬描述符的實現方式:

class A{
    virtual ~A() = 0;
}

inline A::~A(){
    //implementation
}

一個純虛擬析構函數必須具有一個實現(假設您至少有一個具體的派生類)。

沒有規則規定純虛擬析構函數必須具有空主體。 除了大多數析構函數應該具有空主體的相同原因外,我也不知道應該這樣做。

純虛擬析構函數可以是內聯或非內聯的。 我希望每種方法的好處取決於基類和具有非平凡析構函數的非靜態成員的數量。

但是,還有一個問題:在某些流行的編譯器上,如果析構函數是為該類定義的唯一虛擬方法,則最好使其非內聯,以幫助實現處理其多態性魔術。

聽起來很奇怪。

首先,“是的,它可以實現”是一個很奇怪的說法。 實際上需要具有實現(至少在C ++ 98中)。 沒有辦法解決。 任何使用過純虛擬析構函數的人都知道。

其次,它不應該總是為空。 它只是應該做它需要做的事情。 如果您在此處無事可做,請將其留空。 否則,它將不會為空。

最后,它可以是內聯或非內聯-沒什么區別。 確實是不能在類定義中定義它。 該定義必須是一流的(內聯與否-無關緊要)。

您需要實現純虛擬析構函數,因為虛擬析構函數的工作方式是首先調用派生程度最大的類的析構函數,然后再調用每個基類的析構函數。 這意味着即使類是抽象的,編譯器也會生成對基類純虛擬析構函數的調用,因此您必須為函數提供主體。 如果您不提供正文,則鏈接器將抱怨缺少符號。

在某些情況下,即使您的類不包含任何純虛函數,您也希望基類是抽象的。 在這里聲明純虛擬析構函數將使您的類抽象。 在這種情況下,析構函數可以具有空的主體。 為避免支付對空主體析構函數的調用的開銷成本,請將其聲明為內聯。

請記住,“必須”和“應該”意味着不同的含義...

純虛擬析構函數可以是非空的。 不知道誰可能會說其他話。

應該是嗎 是的,因為抽象庫不應刪除任何內容。 您會發現您有時會違反后者的“應該”,因此當然也可能違反后者。

應該是內聯的嗎? 它既不也不應該。 我想不出通過“內聯”可以明顯獲得任何收益,因為實現都可以隨意忽略內聯和內聯非內聯。 通常,雖然沒有理由只創建抽象類中的空析構函數來實現文件。

暫無
暫無

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

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