问题:

为什么析构函数总是虚函数?如果这是必要的,那么为什么C++不把虚析构函数直接作为默认值?

答案:

编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。

所以建议的方式是将析构函数声明为虚函数。如果你使用MFC,并且以CObject或其派生类为基类,那么MFC已经为你做了这件事情;CObject的析构函数是虚函数。一个函数一旦声明为虚函数,那么不管你是否加上virtual 修饰符,它在所有派生类中都成为虚函数。但是由于理解明确起见,建议的方式还是加上virtual 修饰符。

C++不把虚析构函数直接作为默认值的原因是虚函数表的开销以及和C语言的类型的兼容性。有虚函数的对象总是在开始的位置包含一个隐含的虚函数表指针成员。如果是对于MFC类CPoint和CSize这样的小型类,增加一个指针就增加了很多内存占用,而且使得其内存表示和基类POINT和SIZE不一致。如果两个类的内存表示一致,那么这样你可以安全地把一个类的指针或数组当作另一个类的指针或数组使用。

原文链接:https://blog.csdn.net/left_la/article/details/12096861

C++中为何析构函数总是虚函数?相关推荐

  1. 为什么构造函数不能声明为虚函数,析构函数可以,构造函数中为什么不能调用虚函数?

    为什么构造函数不能声明为虚函数,析构函数可以,构造函数中为什么不能调用虚函数 构造函数中为什么不能调用虚函数? 第一个理由是概念上的 第二个理由是机械上的. 构造函数不能声明为虚函数的原因是 1 构造 ...

  2. C++中的继承与虚函数各种概念

    虚继承与一般继承 虚继承和一般的继承不同,一般的继承,在目前大多数的C++编译器实现的对象模型中,派生类对象会直接包含基类对象的字段.而虚继承的情况,派生类对象不会直接包含基类对象的字段,而是通过一个 ...

  3. 构造函数及析构函数与虚函数的关系

    我们都知道构造函数不能为虚函数,而基类的析构函数一般都要定义为虚函数.今天重新复习了一下,特在此记载,以便查找. 构造函数不能为虚函数主要有以下两点 1.必要性分析: 当定义派生类对象时,它会主动依次 ...

  4. 析构函数为虚函数的作用

    如果要用继承,那么一定要让析构函数是虚函数 如果一个函数是虚函数,那么在子类中也要是虚函数 #include iostream.h class Base {public:Base(){ cout< ...

  5. C++多继承中重写不同基类中相同原型的虚函数

    在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA  {  public:  virtual void TestA();  };  class ...

  6. C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中

    C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中 测试2:证明派生类的虚函数的地址跟第一基类的虚函数地址保存在同一张虚函数表中. 派生类有多少个拥有虚函数的基类,派生类对象就有多少 ...

  7. C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765

    https://www.zhihu.com/question/30838092/answer/49623765 C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? 代码如下 ...

  8. 析构函数和虚函数、纯虚函数

    置于"-"是析构函数:析构函数因使用"-"符号(逻辑非运算符),表示它为逆构造函数,加上类名称来定义.  析构函数也是特殊的类成员函数,它没有返回类型,没有参数 ...

  9. java 析构函数_C++虚函数

    码字不易,欢迎给个赞! C++虚函数是多态性实现的重要方式,当某个虚函数通过指针或者引用调用时,编译器产生的代码直到运行时才能确定到底调用哪个版本的函数.被调用的函数是与绑定到指针或者引用上的对象的动 ...

最新文章

  1. rhel6下组建两台主机的HA集群
  2. HDU1266 Reverse Number
  3. Docker环境运行Vue项目
  4. LeetCode 206. 反转链表
  5. LeetCode 36. 有效的数独(哈希)
  6. 哈啰出行架构调整:两轮电动车租售平台将升级为独立事业部
  7. html绝对定位怎么页面居中,html – 如何将绝对定位的元素居中?
  8. FFMPEG结构体分析:AVPacket
  9. JavaScript练习
  10. 简单的 Nodejs jade 实现Hello world
  11. 区块链专利申请全球过半 厉害了我的国
  12. Linux开启root用户
  13. JS的数据类型分类以及用法,没有这些基础,学不好js
  14. 位运算常用技巧分析汇总(算法进阶)
  15. jquery mobile_jQuery Mobile课程1
  16. LeetCode 13 罗马符号转化为数字(难度: Easy)
  17. 炼铁工业如何解决工业废气?氨法脱硫有奇效
  18. CC(标准)版D碟收藏指南(二)
  19. ImageJ工具的使用
  20. 西门子PLC控制康耐视COGNEX相机拍照检测注意点

热门文章

  1. python网课一般多少钱-Python培训网课一般学费多少?毕业生能承担吗?
  2. python3教程-Python3 教程
  3. python手机版下载3.7.2-qpython手机版下载
  4. 未来教育python视频百度云-2019年计算机二级Python语言程序设计考试大纲
  5. windows 10 python哪个版本的好-windows支持哪个版本的python
  6. python基础知识选择题-Python练习题(基础知识练习题(一))
  7. python实习做什么工作-大一/大二学生Python实习的困惑?
  8. python读取excel-Python中使用第三方库xlrd来读取Excel示例
  9. python内置collections模块的使用
  10. 在Windows Mobile和Wince(Windows Embedded CE)下如何使用.NET Compact Framework开发进程管理程序...