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

Do I have to define pure virtual destructor outside class body?

本文关键字:定义 虚拟 析构函数 是否      更新时间:2023-10-16

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

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