关于纯虚析构函数的问题

Posted

技术标签:

【中文标题】关于纯虚析构函数的问题【英文标题】:Question about pure virtual destructor 【发布时间】:2010-11-03 05:10:42 【问题描述】:

如果我们定义一个具有纯虚析构函数的抽象类,为什么我们必须在抽象类中定义析构函数?

【问题讨论】:

重复***.com/questions/630950/pure-virtual-destructor-in-c 【参考方案1】:

基类的析构函数必须在对象被销毁时调用,所以它需要一个定义。

【讨论】:

【参考方案2】:

正如 Jesse 所指出的,继承的析构函数总是会被调用(编译器会为您调用它们,但无法覆盖此行为),因此虚拟析构函数必须具有实现是理所当然的。那么如果纯虚析构函数必须有一个实现,那么纯虚析构函数和常规虚析构函数有什么区别呢?如果您的抽象类只声明了虚析构函数而没有其他纯虚方法,则将析构函数设为纯将阻止某人实例化抽象类。

【讨论】:

【参考方案3】:

因为标准是这样说的:

12.4.7 析构函数可以声明为虚拟(10.3)或纯虚拟(10.4);如果在程序中创建了该类或任何派生类的任何对象,则应定义析构函数。

这样做的原因是它在派生类的对象被销毁时显式调用。

另请参阅我上一个问题的答案:Under what circumstances is it advantageous to give an implementation of a pure virtual function?

【讨论】:

说它被“明确地”称为是不正确的。您参考了该标准很有帮助,但您应该编辑您的答案,使其在形式上更正确。 “显式”与通常调用析构函数的方式相反。【参考方案4】:

只有虚拟 dtor 可以声明为纯的。但是,由于您添加了声明,因此您必须实现 dtor 的主体。如前所述,析构函数调用其父 dtor,直至继承链。

【讨论】:

以上是关于关于纯虚析构函数的问题的主要内容,如果未能解决你的问题,请参考以下文章

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

为啥纯虚析构函数需要实现

C++ 虚析构和纯虚析构

C++中的各种“虚“-- 虚函数纯虚函数虚继承虚基类虚析构纯虚析构抽象类讲解

C++中的各种“虚“-- 虚函数纯虚函数虚继承虚基类虚析构纯虚析构抽象类讲解

虚析构函数与纯虚函数