簡體   English   中英

我是否必須在類體外定義純虛擬析構函數?

[英]Do I have to define pure virtual destructor outside class body?

我試過的兩個編譯器接受這種語法,但我在某處讀到純虛析構函數定義應始終在類之外。 我編寫的代碼:

class AbstractBase
{
public:
    virtual ~AbstractBase() = 0
    {}

    virtual void foo()
    {
        ...
    }
};

根據標准,您無法在類體內定義純虛函數。
有些編譯器確實支持此功能作為擴展。 請注意,使用此擴展程序會使您的代碼在不同的編譯器中不可移植。

參考:

C ++ 03 10.4第2段:

[注意:函數聲明不能​​同時提供純指定符和定義-end note] [示例:

 struct C { virtual void f() = 0 { }; // ill-formed }; 

- 末端的例子]

語法不允許同時使用= 0{ } ,因此您應該單獨定義析構函數,就像在.cpp文件中一樣。

某些編譯器可能允許您的版本作為擴展。

Microsoft Visual Studio接受這種語法,坦率地說,gcc 編譯器似乎也不會對此感到不滿。 但是,它不是你應該擔心的編譯器,它是鏈接器。 在類定義(在頭文件中)中定義純虛擬析構函數導致相同符號的多個定義。 我不是100%確定MSVC編譯器究竟是如何處理這種情況的,但是gcc可能會抱怨。 此外,即使使用MSVC,當項目增長並分成多個靜態/動態庫時,您可能會遇到麻煩。

暫無
暫無

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

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