3

我试过的两个编译器都接受了这种语法,但我在某处读到纯虚拟析构函数定义应该总是在类之外。我的代码编译:

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

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

3 回答 3

7

根据标准,您不能在类体内定义纯虚函数。
不过,一些编译器确实支持此功能作为扩展。请注意,使用此扩展将使您的代码在不同的编译器中不可移植。

参考:

C++03 10.4 第 2 段:

[注意:函数声明不能​​同时提供纯说明符和定义——尾注] [示例:

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

——结束示例]

于 2012-09-25T06:53:04.940 回答
2

该语法不允许同时使用两者= 0{ }因此您应该单独定义析构函数,就像在 .cpp 文件中一样。

一些编译器可能允许您的版本作为扩展。

于 2012-09-25T06:36:49.847 回答
1

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

于 2012-09-25T06:42:11.247 回答