我知道需要纯虚拟析构函数的情况。我也知道,如果我们不为他们提供实现,则会给我一个链接器错误。我不明白的是为什么在代码片段中应该是这种情况,如下所示:
int main()
{
Base * p = new Derived;
}
这里没有删除,因此没有对析构函数的调用,因此也不需要实现(假设它的行为就像声明但未定义的其他普通函数一样,链接器仅在我们调用它们时抱怨)...还是我遗漏了什么?
我需要了解为什么这应该是特例?
编辑:基于BoBTFish的评论
这是我的基础班和派生班
class Base
{
public:
Base(){}
virtual ~Base() = 0;
};
class Derived : public Base
{
};
编译器尝试在给定virtual
(纯或非纯)析构函数的情况下构建虚拟表,并且由于找不到实现而抱怨。
virtual
析构函数与其他virtual
函数的不同之处在于,无论对象是否实现,销毁对象时都会调用它们。这要求编译器将其添加到vf表中,即使未显式调用它也是如此,因为派生类析构函数需要它。
从标准上来说,该标准需要一个纯virtual
析构函数来实现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句