我試過的兩個編譯器接受這個語法,但是我在某處讀到純虛擬析構函數定義應該總是在類之外。 我的代碼編譯:我是否必須在類體外定義純虛析構函數?
class AbstractBase
{
public:
virtual ~AbstractBase() = 0
{}
virtual void foo()
{
...
}
};
我試過的兩個編譯器接受這個語法,但是我在某處讀到純虛擬析構函數定義應該總是在類之外。 我的代碼編譯:我是否必須在類體外定義純虛析構函數?
class AbstractBase
{
public:
virtual ~AbstractBase() = 0
{}
virtual void foo()
{
...
}
};
根據標準,您不能在類體內定義純虛函數。
儘管如此,一些編譯器確實支持這個功能。請注意,使用此擴展將使您的代碼在不同的編譯器中不可移植。
參考:
C++ 03 10.4第2段:
[注:函數聲明不能同時提供純說明符和定義末端說明】[實施例:
struct C { virtual void f() = 0 { }; // ill-formed };
末端示例]
語法不允許兩個= 0
和{ }
的同時,讓你都應該單獨定義的析構函數,像在.cpp文件。
有些編譯器可能允許您的版本作爲擴展。
Microsoft Visual Studio接受這種語法,坦率地說,海灣合作委員會編譯器似乎也不會不高興。 但是,它不是你應該擔心的編譯器,它是鏈接器。 在類定義(在頭文件中)中定義了純虛擬析構函數後,會得到同一符號的多重定義。我不是100%確定MSVC編譯器如何處理這種情況,但gcc可能會抱怨。另外,即使使用MSVC,當項目增長並分解成多個靜態/動態庫時,您可能會遇到麻煩。
@KirillKobelev:你錯了。[純虛擬方法可以有很多實現(定義)](http://www.gotw.ca/gotw/031.htm)。 –
我沒有設計語言。 :-)析構函數必須總是有一個實現,因爲它是從派生類的析構函數中調用的。 –