我是否必须在类体之外定义纯虚拟析构函数
Do I have to define pure virtual destructor outside class body?
两个编译器 我试图接受这种语法,但我在某处读到纯虚拟析构函数定义应该总是在类之外。我的代码编译:
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,当项目增长并拆分为多个静态/动态库时,您也可能会遇到麻烦。
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 如何进行故障排除:未定义对"非虚拟 thunk to ..."的引用
- 重载虚拟行为是否定义良好?
- 纯虚拟类和错误未定义对 'vtable 的引用
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义
- 无法使用在子类中定义的虚拟getter实现基类
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- 没有针对完全专用模板类的外联虚拟方法定义
- 为什么虚拟方法生成对_sbrk的未定义引用?
- 在C++为矢量编写自定义虚拟分配器时遇到问题
- 是否需要定义虚拟析构函数
- 此处未定义虚拟析构函数
- 如何在子类中初始化具有自定义虚拟函数的基成员变量
- 在C++中定义虚拟get和set函数是否被认为是一种好的做法
- 在派生类中重新定义虚拟运算符==
- 在C++中定义虚拟继承的两种不同方式
- 在哪里可以定义虚拟函数
- 为什么不能使用来定义虚拟函数