1 C++类的对象构造的时候,首先申请一片内存,然后调用构造函数进行初始化;

我们知道,存在虚函数的话,也会存在一个虚函数表vtable,而虚函数表示在什么时候产生的呢,当然是在调用构造函数之后产生的;

那么问题来了,如果构造函数为虚函数,此时的内存是一片空白,不存在该虚函数表vtable,那么无法找到该构造函数;

所以说,构造函数不能为虚函数。

2 此外,如果有以下代码:

class A{A() {}
};
class B: public A{B():A() {}
};
int main(){B b;B *pb = &b;
}

则构造B类的时候,构造函数执行顺序是:

A() B()

根据虚函数的性质,如果A的构造函数为虚函数,且B类也给出了构造函数,则应该只执行B类的构造函数,不再执行A类的构造函数,这样A就无法构造了,产生了矛盾;

因此,构造函数不能为虚函数。

对于析构函数而言,可以为虚函数,因为此时虚函数表早已建立;并且,常常析构函数都是虚函数。原因就是,通过基类指针在销毁对象的时候,可以正确的识别要销毁对象的类型,从而防止析构不完全的出现。

转载于:https://blog.51cto.com/jincheng/1746928

C++类的构造函数不能为虚函数的原因相关推荐

  1. C# 构造函数中调用虚函数

    C# 构造函数中调用虚函数 using System; using System.Diagnostics; using System.Text; using System.Collections; u ...

  2. 构造函数不能为虚函数

    2019独角兽企业重金招聘Python工程师标准>>> 1,从存储空间角度 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的.问题出来了,如 ...

  3. c++ map 析构函数_C++|类继承关系中的虚函数、虚析构函数、虚基类

    在继承关系中,虚函数.虚析构函数.虚基类中使用的关键字virtual都是在告诉编译器,此处要进行特殊处理: 虚函数:函数重写时的要求编译器动态绑定来实现多多态 : 虚析构函数:当基类指针指向在堆内实现 ...

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

    为什么构造函数不能是虚函数 从存储空间角度看,使用虚函数时,系统要有一定的空间开销,当一个类带有虚函数时,编译系统会为该类构造一个虚函数表(virtual function table),他是一个指针 ...

  5. 为什么C++构造函数不能是虚函数

    这是一个"鸡生蛋还是蛋生鸡"的问题. 首先我们要明白,虚函数是如何调用的.如果一个类有虚函数,那么必然对应一个虚函数表vtable,这个虚函数表的指针指向的是虚函数的地址.当一个基 ...

  6. 构造函数为什么一般不定义为虚函数?而析构函数一般写成虚函数的原因 ?

    1.构造函数不能声明为虚函数 1)因为创建一个对象时需要确定对象的类型,而虚函数是在运行时确定其类型的.而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象的实际类型,是类本身还是类的派生类等 ...

  7. 第十三周项目三-形状类族中的纯虚函数

    /* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年6月1日 *版 本 ...

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

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

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

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

最新文章

  1. 闪退怎么看logcat_iPhone手机点开软件就闪退如何解决?
  2. php字符串常用算法--字符串加密解密
  3. //某父元素(.class)底下相同class的第二的取值
  4. 06列表的常用基本操作
  5. BZOJ3747: [POI2015]Kinoman
  6. hadoop 传感器数据_读取模式错误,计算引擎操作复杂……面对Hadoop这些问题该如何应对?...
  7. c语言++数组名【数字】_C ++程序在数组中打印所有非重复数字
  8. 基于Vue+Vue-Router+Vuex+Element-ui+axios,高仿小米商城,实现的电商项目
  9. macos vmware 镜像_苹果电脑用vMware安装Windows系统
  10. HIT Software Construction Review Notes(2-2 Process, Systems, and Tools of Software Construction)
  11. 网页游戏开发秘笈 PDF扫描版
  12. 求素数 java 101 200_Java求101~200之间的素数
  13. 天之痕java 郡王府_轩辕剑3外传天之痕图文攻略【含支线任务】
  14. 心理正常与异常的区分_判断心理正常异常三原则
  15. Libra最后的命运
  16. 【QT项目】简易五子棋游戏(人机对战)— 完整源码
  17. 首批Android Q版本真机上线,Testin云测助力尝鲜
  18. win server服务器 关闭危险端口 135,137,138,139,445的方法
  19. 全网最全面的python的讲解,讲的无可挑剔《记得收藏》
  20. ABAC权限模型的设计

热门文章

  1. Android优化之内存优化倒计时篇
  2. Git学习系列之Git基本操作提交项目(图文详解)
  3. loadrunner-2-12日志解析
  4. 在controller中无法通过注解@Value获取到配置文件中定义的值解决办法
  5. eruke注册中心搭建
  6. (转)全文检索技术学习(一)——Lucene的介绍
  7. 大数据算法系列——布隆过滤器
  8. Ext.Net学习笔记22:Ext.Net Tree 用法详解
  9. [RGEOS]空间拓扑关系
  10. 12cR2 RAC+RAC+ADG ORA-16854