我需要在类体外定义纯虚析构函数吗?

3

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

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

    virtual void foo()
    {
        ...
    }
};
3个回答

7
根据标准,您不能在类体内定义纯虚函数。尽管如此,一些编译器支持这种功能作为扩展。请注意,使用此扩展将使您的代码在不同的编译器中不可移植。
参考文献: C++03 10.4第2段。

[Note: a function declaration cannot provide both a pure-specifier and a definition —end note] [Example:

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

—end example]


2
语法不允许同时使用= 0{ },因此您应该单独定义析构函数,就像在.cpp文件中一样。
一些编译器可能会将您的版本作为扩展允许。

@KirillKobelev:你错了。纯虚方法完全可以有实现(定义) - Alok Save
我并没有设计这门语言。 :-) 析构函数必须始终具有实现,因为它会从派生类的析构函数中调用。 - Bo Persson

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接