我们都知道构造函数不能为虚函数,而基类的析构函数一般都要定义为虚函数。今天重新复习了一下,特在此记载,以便查找。


构造函数不能为虚函数主要有以下两点

1、必要性分析:
当定义派生类对象时,它会主动依次调用构造函数,顺序为基类的构造函数->一级派生类构造函数->二级派生类构造函数….直到当前派生类的构造函数调用完毕为止,到此派生类对象生成。
而虚函数存在的意义为动态绑定,从上一段话可知,它会从基类开始依次自动调用相应的构造函数,根本就不存在动态绑定的必要。
2、内存角度分析:
构造函数的作用是生成相应的类对象。虚函数的动态绑定是依据一张虚函数表来确认的最终绑定到哪一个虚函数版本。
而调用构造函数之前,我们对类对象所做的操作仅限于分配内存,还没有对内存进行初始化。此时,内存空间上也不存在虚函数表,因此,按照这样的执行顺序,虚函数的动态绑定是实现不了的。


基类析构函数与虚函数的关系

如果类的数据成员中不存在成员(指针)与动态分配的内存相关联,我们一般不用自己定义析构函数,而是采用默认的析构函数析构类对象。一旦与动态分配的内存相关联,为了防止内存泄露,我们需要自己定义析构函数,手动释放动态分配的内存。

三法则:如果一个类需要析构函数,几乎也需要定义赋值构造函数和重载赋值操作符。

在分析基类析构函数为什么要定义为虚析构函数之前,我们要先明白虚函数存在的意义就是为了动态绑定,实现面向对象的特性之一 :多态。

我们知道通过基类的指针或者引用可以实现对虚函数的动态绑定,那么当我们通过一个基类指针或者引用来析构一个对象时,我们是无法判断基类现在绑定的对象是基类还是派生类,如果析构函数不是虚函数,那么基类指针只会调用基类的析构函数,如此就发生了一些不该发生的事。只有将析构函数定义为虚函数,才能通过动态绑定,调用对应的析构函数版本,正确的析构类对象。

可以这么说:任何class只要有virtual函数都几乎确定也要有一个virtual析构函数(引用自Effective C++ 条款7)

构造函数及析构函数与虚函数的关系相关推荐

  1. 构造函数不可以是虚函数;析构函数可以是虚函数,也可以是纯虚函数。

    构造函数不可以是虚函数:析构函数可以是虚函数,也可以是纯虚函数. 一:构造函数不能声明为虚函数的原因 1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的. 而在构造 ...

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

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

  3. C++类的构造函数、析构函数与赋值函数

    C++类的构造函数.析构函数与赋值函数 构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险. 每个类只有一个析构函数和 ...

  4. C++构造函数和析构函数调用虚函数时都不会使用动态联编

    先看一个例子: #include <iostream> using namespace std;class A{ public:A() {show();}virtual void show ...

  5. 构造函数为什么不能是虚函数 ( 转载自C/C++程序员之家)

    从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的.问题出来了,如果构造函数是虚的,就需要通过 vtable来调用, ...

  6. C++学习——构造函数,析构函数与虚函数关系

    文章目录 1.构造函数,析构函数可以为虚函数吗? 2.析构函数和构造函数的作用? 3.构造函数和析构函数调用顺序? 4.类什么时候会调用析构函数? 1.构造函数,析构函数可以为虚函数吗? 构造函数不可 ...

  7. 构造函数为什么不能是虚函数

    从存储空间角度看 虚函数相应一个指向vtable虚函数表的指针,这大家都知道,但是这个指向vtable的指针事实上是存储在对象的内存空间的. 问题出来了,假设构造函数是虚的.就须要通过 vtable来 ...

  8. C++中为何析构函数总是虚函数?

    问题: 为什么析构函数总是虚函数?如果这是必要的,那么为什么C++不把虚析构函数直接作为默认值? 答案: 编译器总是根据类型来调用类成员函数.但是一个派生类的指针可以安全地转化为一个基类的指针.这样删 ...

  9. String 的普通构造函数、拷贝构造函数、析构函数、赋值函数

    转自:http://blog.csdn.net/xiaoxiangzhu660810/article/details/8149398 题目:编写类String的构造函数.析构函数和赋值函数,已知类St ...

最新文章

  1. 第二周期的第一次站立会议
  2. Python 查看本机WiFi密码
  3. python函数装饰函数_Python精进-装饰器与函数对象
  4. swift_026(Swift 的类型转换)
  5. RouterOs建立PPPoE虚拟拨号服务器
  6. 如何理解c和c ++的复杂类型声明 (转)
  7. SAP ERP里如何创建一个新的material类型
  8. 25年前,互联网大佬在最原始的论坛网上冲浪
  9. 开发iOS百度地图大头针可以重复点击
  10. mac 2k显示器字体发虚_亲身实践:Mac mini 搭配戴尔显示器体验
  11. PHP实现文件上传,下载,批量下载
  12. Word2007发布文章成功
  13. 网易镜像 mysql_Docker的常用镜像及使用方式
  14. 《商务与经济统计》练习:案例3-4:天使巧克力的网络交易
  15. python教程视频全套下载-Python爬虫视频教程全集下载
  16. 会议论文分析-CCS21-ML增强的符号执行方法
  17. 致远OA表单自定义函数(明细表去重拼接)
  18. 免费开源cms自助建站系统大全,不会编程也可以自己建网站
  19. Taichi安装与应用
  20. floodFill详解

热门文章

  1. MyEclipse破解 注册机“System id无法生成” 解决方法:出现com.jniwrapper.util.ProcessorInfo
  2. 【CEDEC 2015】【夏日课堂】制作事宜技术篇,新手职员挑战VR Demo开发的真相
  3. 奇门排盘app 保存html,‎App Store 上的“奇门-支持多种奇门的专业排盘系统”
  4. 进入摩莎MOXA的步骤:
  5. 人人都是价值观-思辨专家
  6. python 教你人人影视美剧下载?你爱了吗?
  7. 快手小店违约金不交会有什么影响?快手违规如何申诉?
  8. lua 学习笔记---游戏开发第一步
  9. Tenorshare UltData for Mac(iOS数据恢复备份软件)
  10. BlockCanary 工具介绍