![](/img/trans.png)
[英]C++ — why should we define the pure virtual destructor outside the class definition?
[英]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.