首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时不使用虚拟析构函数?

何时不使用虚拟析构函数?
EN

Software Engineering用户
提问于 2015-05-21 06:30:22
回答 6查看 63.2K关注 0票数 64

我相信我曾多次搜索过虚拟析构函数,大多数都提到了虚拟析构函数的用途,以及为什么需要虚拟析构函数。而且,我认为在大多数情况下,析构函数需要是虚拟的。

那么问题是:为什么c++在默认情况下不设置所有析构函数?或在其他问题上:

我什么时候不需要使用虚拟析构函数?

在这种情况下,我不应该使用虚拟析构函数?

如果我不需要使用虚拟析构函数,那么使用它的成本是多少?

EN

回答 6

Software Engineering用户

发布于 2015-05-21 06:48:05

在这种情况下,我不应该使用虚拟析构函数?

  1. 对于不想被继承的具体类。
  2. 对于没有多态删除的基类。两个客户端都不应该能够使用指向Base的指针以多形性方式删除。

顺便说一下,

在哪种情况下应该使用虚拟析构函数?

对于具有多态删除的基类。

票数 30
EN

Software Engineering用户

发布于 2015-05-21 06:35:40

为什么c++不默认设置所有析构函数为虚拟?额外存储和调用虚拟方法表的成本。C++用于系统、低延迟、rt编程,这可能是负担.

票数 11
EN

Software Engineering用户

发布于 2015-05-21 06:56:15

这是一个很好的示例,说明何时不使用虚拟析构函数:来自Scott:

如果一个类不包含任何虚拟函数,这通常表明它不打算用作基类。当类不打算用作基类时,使析构函数变为虚拟通常是个坏主意。根据ARM中的讨论,考虑这个例子:

代码语言:javascript
复制
// class for representing 2D points
class Point {
public:
    Point(short int xCoord, short int yCoord);
    ~Point();
private:
    short int x, y;
};

如果短时int占用16位,则Point对象可以放入32位寄存器中.此外,Point对象可以作为32位数量传递给用C或FORTRAN等其他语言编写的函数。但是,如果Point的析构函数是虚拟的,则情况会发生变化。

当您添加虚拟成员时,将向您的类添加一个虚拟指针,指向该类的虚拟表。

票数 7
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/284561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档