我是否必须在类体外定义纯虚拟析构函数?

时间:2012-09-25 06:32:48

标签: c++ inline destructor pure-virtual

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

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

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

3 个答案:

答案 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,当项目增长并分成多个静态/动态库时,您可能会遇到麻烦。