C++类的构造函数不能为虚函数的原因
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++类的构造函数不能为虚函数的原因相关推荐
- C# 构造函数中调用虚函数
C# 构造函数中调用虚函数 using System; using System.Diagnostics; using System.Text; using System.Collections; u ...
- 构造函数不能为虚函数
2019独角兽企业重金招聘Python工程师标准>>> 1,从存储空间角度 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的.问题出来了,如 ...
- c++ map 析构函数_C++|类继承关系中的虚函数、虚析构函数、虚基类
在继承关系中,虚函数.虚析构函数.虚基类中使用的关键字virtual都是在告诉编译器,此处要进行特殊处理: 虚函数:函数重写时的要求编译器动态绑定来实现多多态 : 虚析构函数:当基类指针指向在堆内实现 ...
- 为什么构造函数不能是虚函数
为什么构造函数不能是虚函数 从存储空间角度看,使用虚函数时,系统要有一定的空间开销,当一个类带有虚函数时,编译系统会为该类构造一个虚函数表(virtual function table),他是一个指针 ...
- 为什么C++构造函数不能是虚函数
这是一个"鸡生蛋还是蛋生鸡"的问题. 首先我们要明白,虚函数是如何调用的.如果一个类有虚函数,那么必然对应一个虚函数表vtable,这个虚函数表的指针指向的是虚函数的地址.当一个基 ...
- 构造函数为什么一般不定义为虚函数?而析构函数一般写成虚函数的原因 ?
1.构造函数不能声明为虚函数 1)因为创建一个对象时需要确定对象的类型,而虚函数是在运行时确定其类型的.而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象的实际类型,是类本身还是类的派生类等 ...
- 第十三周项目三-形状类族中的纯虚函数
/* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年6月1日 *版 本 ...
- C++多继承中重写不同基类中相同原型的虚函数
在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: virtual void TestA(); }; class ...
- C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765
https://www.zhihu.com/question/30838092/answer/49623765 C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? 代码如下 ...
最新文章
- 闪退怎么看logcat_iPhone手机点开软件就闪退如何解决?
- php字符串常用算法--字符串加密解密
- //某父元素(.class)底下相同class的第二的取值
- 06列表的常用基本操作
- BZOJ3747: [POI2015]Kinoman
- hadoop 传感器数据_读取模式错误,计算引擎操作复杂……面对Hadoop这些问题该如何应对?...
- c语言++数组名【数字】_C ++程序在数组中打印所有非重复数字
- 基于Vue+Vue-Router+Vuex+Element-ui+axios,高仿小米商城,实现的电商项目
- macos vmware 镜像_苹果电脑用vMware安装Windows系统
- HIT Software Construction Review Notes(2-2 Process, Systems, and Tools of Software Construction)
- 网页游戏开发秘笈 PDF扫描版
- 求素数 java 101 200_Java求101~200之间的素数
- 天之痕java 郡王府_轩辕剑3外传天之痕图文攻略【含支线任务】
- 心理正常与异常的区分_判断心理正常异常三原则
- Libra最后的命运
- 【QT项目】简易五子棋游戏(人机对战)— 完整源码
- 首批Android Q版本真机上线,Testin云测助力尝鲜
- win server服务器 关闭危险端口 135,137,138,139,445的方法
- 全网最全面的python的讲解,讲的无可挑剔《记得收藏》
- ABAC权限模型的设计