从存储空间角度看

虚函数相应一个指向vtable虚函数表的指针,这大家都知道,但是这个指向vtable的指针事实上是存储在对象的内存空间的。

问题出来了,假设构造函数是虚的。就须要通过 vtable来调用。但是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。

从使用角度

虚函数主要用于在信息不全的情况下,能使重载的函数得到相应的调用。构造函数本身就是要初始化实例。那使用虚函数也没有实际意义呀。

所以构造函数没有必要是虚函数。

虚函数的作用在于通过父类的指针或者引用来调用它的时候可以变成调用子类的那个成员函数。

而构造函数是在创建对象时自己主动调用的,不可能通过父类的指针或者引用去调用(没有存在的必要)。因此也就规定构造函数不能是虚函数。

构造函数不须要是虚函数。也不同意是虚函数

由于创建一个对象时我们总是要明白指定对象的类型。虽然我们可能通过基类的指针或引用去訪问它但析构却不一定,我们往往通过基类的指针来销毁对象。这时候假设析构函数不是虚函数,就不能正确识别对象类型从而不能正确调用析构函数。

从实现上看

vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数。从实际含义上看,在调用构造函数时还不能确定对象的真实类型(由于子类会调父类的构造函数);并且构造函数的作用是提供初始化,在对象生命期仅仅运行一次,不是对象的动态行为,也没有必要成为虚函数

虚函数表实现角度

当一个构造函数被调用时。它做的首要的事情之中的一个是初始化它的VPTR

因此。它仅仅能知道它是“当前”类的,而全然忽视这个对象后面是否还有继承者。当编译器为这个构造函数产生代码时,它是为这个类的构造函数产生代码——既不是为基类,也不是为它的派生类(由于类不知道谁继承它)。

所以它使用的VPTR必须是对于这个类的VTABLE。并且,仅仅要它是最后的构造函数调用,那么在这个对象的生命期内。VPTR将保持被初始化为指向这个VTABLE, 但假设接着另一个更晚派生的构造函数被调用,这个构造函数又将设置VPTR指向它的VTABLE,等直到最后的构造函数结束。VPTR状态是由被最后调用的构造函数确定的。这就是为什么构造函数调用是从基类到更加派生类顺序的另一个理由。但是,当这一系列构造函数调用正发生时。每一个构造函数都已经设置VPTR指向它自己的VTABLE。假设函数调用使用虚机制。它将仅仅产生通过它自己的VTABLE的调用,而不是最后的VTABLE(全部构造函数被调用后才会有最后的VTABLE)。

构造函数为什么不能是虚函数相关推荐

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

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

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

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

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

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

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

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

  5. C++构造函数与析构函数调用虚函数的注意事项

    虽然可以对虚函数进行实调用,但程序员编写虚函数的本意应该是实现动态联编.在构造函数中调用虚函数,函数的入口地址是在编译时静态确定的,并未实现虚调用.但是为什么在构造函数中调用虚函数,实际上没有发生动态 ...

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

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

  7. C++中为何构造函数不可是虚函数,而析构函数可以?

    构造函数不可以是虚函数: 从实现上看,虚函数表在构造函数调用后才建立,因而构造函数不可能成为虚函数 从实际含义上看,在调用构造函数时还不能确定对象的真实类型(因为子类会调父类的构造函数):而且构造函数 ...

  8. 构造函数不可以声明为虚函数,析构函数可以声明为虚函数

    构造函数不能声明为虚函数,而析构函数可以声明为虚函数,在有的情景下析构函数必须声明为虚函数.  不建议在构造函数和析构函数里调用虚函数. 构造函数不能声明为虚函数的原因? 构造一个对象时,必须知道对象 ...

  9. 构造函数和析构函数能不能是虚函数

    从实现上看,vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数      从实际含义上看,在调用构造函数时还不能确定对象的真实类型(因为子类会调父类的构造函数):而且构造函数的作用是提供初始 ...

最新文章

  1. 从实例入手学习使用vue+axios配置代理进行跨域访问百度音乐API
  2. 微软加入字节码联盟,进一步开发支持Blazor 的WebAssembly技术
  3. 小米再回应造车传闻:一直关注,还没正式立项
  4. Oracle 查看索引语句
  5. Python基础——import(导入模块)
  6. ceph peering流程分析
  7. 适用于ARM开发板的Armbian Linux22.08发布
  8. 区块链游戏企鹅大陆上线10000创始限时开放注册
  9. OSPF路由器类型 ABR与ASBR路由聚合区别
  10. 给设计师的建设性反馈
  11. FPGA控制AD7606进行数据采集
  12. 项目oms之----阿里巴巴字体图标运用详解 (含:彩色图标svg运用)
  13. Intel8086处理器使用NASM汇编语言实现操作系统04-实模式-屏幕显示不定长度的字符串(cmp/je)
  14. centos7 kubernetes
  15. Android所有View通用下拉刷新上拉加载控件
  16. Gartner发布商业模式创新框架
  17. 如何减少页面的重绘和回流(14)
  18. 逐行分析鸿蒙系统的 JavaScript 开发框架
  19. redis的多路复用
  20. 离职时老板涨5000元工资留我,该不该留?

热门文章

  1. 惊!史上最佳GAN现身,超真实AI假照片,行家们都沸腾了
  2. 陈天奇的tvm更新了:VTA,开源AI芯片栈
  3. AI需要你帮忙 | 把两栖爬行动物框出来,提高AI识别准确率
  4. mysql 开发进阶篇系列 23 应用层优化与查询缓存
  5. 在树莓派上编译安装golang环境
  6. 在TensorFlow中实现文本分类的卷积神经网络
  7. android openGL ES2 一切从绘制纹理開始
  8. Git版本恢复命令reset(转载)
  9. 微信小程序第三方平台和附近的小程序将开放
  10. 3年了,才这点工资,打死我都不相信