我试过的两个编译器接受这种语法,但我在某处读到纯虚析构函数定义应始终在类之外。 我编写的代码:
class AbstractBase
{
public:
virtual ~AbstractBase() = 0
{}
virtual void foo()
{
...
}
};
答案 0 :(得分:6)
根据标准,您无法在类体内定义纯虚函数 有些编译器确实支持此功能作为扩展。请注意,使用此扩展程序会使您的代码在不同的编译器中不可移植。
<强>参考:强>
C ++ 03 10.4第2段:
[注意:函数声明不能同时提供纯指定符和定义-end note] [例如:
struct C { virtual void f() = 0 { }; // ill-formed };
-end example]
答案 1 :(得分:2)
语法不允许同时使用= 0
和{ }
,因此您应该单独定义析构函数,就像在.cpp文件中一样。
某些编译器可能会允许您的版本作为扩展名。
答案 2 :(得分:1)
Microsoft Visual Studio接受此语法,坦率地说,gcc 编译器似乎也不会对此感到不满。 但是,它不是你应该担心的编译器,它是链接器。 在类定义(在头文件中)中定义纯虚拟析构函数导致相同符号的多个定义。我不是100%确定MSVC编译器究竟是如何处理这种情况的,但是gcc可能会抱怨。此外,即使使用MSVC,当项目增长并分成多个静态/动态库时,您可能会遇到麻烦。