我试过的两个编译器都接受了这种语法,但我在某处读到纯虚拟析构函数定义应该总是在类之外。我的代码编译:
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 接受这种语法,坦率地说,gcc编译器似乎也不会对此感到不满。但是,您应该担心的不是编译器,而是链接器。在类定义中(在头文件中)定义纯虚拟析构函数会导致同一符号的多个定义。我不是 100% 确定 MSVC 编译器如何处理这种情况,但 gcc 可能会抱怨。此外,即使使用 MSVC,当项目增长并拆分为多个静态/动态库时,您也可能会遇到麻烦。