C++:构造函数和析构函数能否为虚函数?

简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数。

(1) 构造函数不能为虚函数

让我们来看看大牛C++之父 Bjarne Stroustrup 在《The C++ Programming Language》里是怎么说的:

To construct an object, a constructor needs the exact type of the object it is to create. Consequently, a constructor cannot be virtual. Furthermore, a constructor is not quite an ordinary function, In particular, it interacts with memory management in ways ordinary member functions don't. Consequently, you cannot have a ponter to a constructor.

--- From 《The C++ Progamming Language》15.6.2

然而大牛就是大牛,这段话对一般人来说太难理解了。那下面就试着解释一下为什么:

这就要涉及到C++对象的构造问题了,C++对象在三个地方构建:(1)函数堆栈;(2)自由存储区,或称之为堆;(3)静态存储区。无论在那里构建,其过程都是两步:首先,分配一块内存;其次,调用构造函数。好,问题来了,如果构造函数是虚函数,那么就需要通过vtable 来调用,但此时面对一块 raw memeory,到哪里去找 vtable 呢?毕竟,vtable 是在构造函数中才初始化的啊,而不是在其之前。因此构造函数不能为虚函数。

(2)析构函数可以是虚函数,且常常如此

这个就好理解了,因为此时 vtable 已经初始化了;况且我们通常通过基类的指针来销毁对象,如果析构函数不为虚的话,就不能正确识别对象类型,从而不能正确销毁对象。

困惑我们的是我们却经常看到“虚构造函数”这样的说法,这就要归咎于不负责任或者说误人子弟的媒体了(包括书、技术文章等等)。因为他们说的是类似下面这样的做法:

class Expr {

public:

     Expr();

     Expr(const Expr&);

     virtual Expr* new_expr() { return new Expr(); }

     virtual Expr* clone() { return new Expr(*this); }

};

最新文章

  1. Django配置和初探
  2. Redis优化之CPU充分利用
  3. tomcat下iims的配置感悟
  4. 小希的数表2(用的for循环)
  5. Oracle数据库入门——如何根据物化视图日志快速刷新物化视图
  6. rabbitmq学习笔记2 基本概念
  7. POJ C++程序设计 编程题#3 编程作业—文件操作与模板
  8. flask开发restful api系列(7)-蓝图与项目结构
  9. Windbg调试(关于句柄表的获取,32位)
  10. Java历程-初学篇 Day07 循环结构2 for循环
  11. AOP的实现的几种方式
  12. JavaScript 数组基本操作
  13. C# 合并、拆分PPT幻灯片
  14. mybatis代码生成器——MyBatis Generator
  15. 利用Linux系统生成随机密码的10种方法【转】
  16. 【DWM1000】 code 解密3一ANCHOR RUN起来
  17. hive命令的执行方式
  18. LOJ#6354. 「CodePlus 2018 4 月赛」最短路[最短路优化建图]
  19. C/C++中printf/cout 计算顺序与缓冲区问题
  20. Kaggle比赛冠军经验分享:如何用 RNN 预测维基百科网络流量

热门文章

  1. Clang提供的办法
  2. Check for Palindromes-freecodecamp算法题目
  3. 【SAM】bzoj5084: hashit
  4. 【netbeans】netbeans utf-8编码
  5. Python基础——数值
  6. usb hub 设备流程图
  7. LeetCode(215) Kth Largest Element in an Array
  8. [转] immutability-helper 插件的基本使用(附源码)
  9. js基础之javascript的存在形式和js代码块在页面中的存放位置和 CSS 对比
  10. foy: 轻量级的基于 nodejs 的通用 build 工具