为什么纯虚拟析构函数需要实现

阿伦

我知道需要纯虚拟析构函数的情况。我也知道,如果我们不为他们提供实现,则会给我一个链接器错误。我不明白的是为什么在代码片段中应该是这种情况,如下所示:

int main()
{
    Base * p = new Derived;
}

这里没有删除,因此没有对析构函数的调用,因此也不需要实现(假设它的行为就像声明但未定义的其他普通函数一样,链接器仅在我们调用它们时抱怨)...还是我遗漏了什么?

我需要了解为什么这应该是特例?

编辑:基于BoBTFish的评论

这是我的基础班和派生班

class Base
{
public:
    Base(){}
    virtual ~Base() = 0;
};

class Derived : public Base
{
};
卢契安·格里戈尔(Luchian Grigore)

编译器尝试在给定virtual(纯或非纯)析构函数的情况下构建虚拟表,并且由于找不到实现而抱怨。

virtual析构函数与其他virtual函数的不同之处在于,无论对象是否实现,销毁对象时都会调用它们。这要求编译器将其添加到vf表中,即使未显式调用它也是如此,因为派生类析构函数需要它。

从标准上来说,该标准需要一个纯virtual析构函数来实现。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们需要C ++中的纯虚拟析构函数?

C ++中的纯虚拟析构函数

为什么要为C ++中的抽象类声明虚拟析构函数?

了解虚拟析构函数

gcc4.9.2的std :: vector的libstdc ++实现继承自_Vector_base(非虚拟析构函数)。为什么这样可以?

为什么std :: unary_function不包含虚拟析构函数

为什么noexcept构造函数需要实例化析构函数?

C ++ 11接口纯虚拟析构函数

跳过声明时,为什么需要琐碎的析构函数?

本地抽象类的纯虚拟析构函数

为什么插入用户定义的析构函数需要用户定义的副本构造函数

为什么我的程序集输出中有两个析构函数实现?

如果结构可以实现IDisposable,为什么它们没有析构函数?

为什么要调用析构函数

为什么此虚拟析构函数在C ++中不起作用?

为什么不将虚拟类的析构函数自动添加到vtable?

为什么析构函数挂起

为什么虚拟析构函数需要删除运算符?

纯抽象类的虚拟析构函数

为什么非虚拟析构函数没有内存泄漏

为什么要使用虚拟析构函数?

为什么使用虚拟析构函数进行std :: vector :: push_back segfaults?

为什么我的虚拟析构函数执行这么多次?

为什么使这个虚拟析构函数内联修复链接器问题?

纯抽象基类的虚拟析构函数

`虚拟``覆盖`析构函数

为什么虚拟析构函数写入内存?

为什么不调用析构函数?

C ++:使用仅具有属性的继承结构时需要实现虚拟析构函数吗?