C++中最好不要在构造函数和析构函数中调用虚函数!!!
1.最好不要在基类和派生类的构造和析构函数中调用虚函数,不会出现多态性
- 实例如下:
#include "iostream"using namespace std;class Base{public:Base(){cout << "Base::Base()\n";fun();}virtual ~Base(){cout << "Base::Base()\n";fun();}virtual void fun(){cout << "Base::fun() virtual\n";}};// 派生类class Derive: public Base{public:Derive(){cout << "Derive::Derive()\n";fun();}~Derive(){cout << "Derive::Derive()\n";fun();}virtual void fun(){cout << "Derive::fun() virtual\n";}};int main(){Base *b = new Base();delete b;cout << "-----------------------------------\n";Derive *d = new Derive();delete d;cout << "-----------------------------------\n";Base *bd = new Derive(); // 基类Base的指针bd指向的是派生类Derive的对象delete bd;return 0;}
- 解释: 第一段代码不加说明,第二段代码Derive *d = new Derive();先调用类的构造函数,这个构造函数是基类Base的fun()函数,因为此时派生类Derive还不存在,然后才构造派生类Derive。析构时,先析构派生类Derive,并调用派生类的fun()函数,再析构基类。第三段代码Base *bd = new Derive();基类Base的指针bd指向派生类对象。构造时,先调用基类Base的构造函数,此时构函数中调用基类中的fun()函数,此时虚函数的动态绑定机制并没有会生效,这是因为此时的派生类还不存在。析构时,先析构派生类,派生类中的fun()函数调用的是自己的fun(),然后析构基类Base,基类析构函数中的fun()调用的是基类Base自己的fun()函数,这里虚函数的动态绑定机制也没有生效,因为此时派生类已经不存在了。
2.总结
- 不要在构造函数中调用虚函数的原因:因为父类对象会在子类之前进行构造,此时子类部分的数据成员还未初始化, 因此调用子类的虚函数是不安全的,故而C++不会进行动态联编。
- 不要在析构函数中调用虚函数的原因:析构函数是用来销毁一个对象的,在销毁一个对象时,先调用子类的析构函数,然后再调用基类的析构函数。所以在调用基类的析构函数时,派生类对象的数据成员已经“销毁”,这个时再调用子类的虚函数已经没有意义了。
3.参考博客
- 参考资料1
- 参考资料2
C++中最好不要在构造函数和析构函数中调用虚函数!!!相关推荐
- C++:构造函数和析构函数能否为虚函数
C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数. (1) 构造函数不能为虚函数 让我们来看看大牛C++之父 Bjarne Stroustrup ...
- 构造函数与析构函数能否为虚函数?
C++C++C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数. 1.构造函数不能为虚函数 让我们来看看大牛C++C++C++之父 BjarneB ...
- C++中最好不要在构造函数和析构函数中调用虚函数
1.最好不要在基类和派生类的构造和析构函数中调用虚函数,不会出现多态性 实例如下: #include "iostream"using namespace std;class Bas ...
- C/Cpp / C++ 构造函数和析构函数可以是虚函数吗
答案 构造函数不可以是虚函数,而析构函数可以且常常是虚函数. 原因 1.构造函数不可以是虚函数 当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表是一个存储成员函数指针的数据结构. 虚函数表 ...
- 构造函数不可以声明为虚函数,析构函数可以声明为虚函数
构造函数不能声明为虚函数,而析构函数可以声明为虚函数,在有的情景下析构函数必须声明为虚函数. 不建议在构造函数和析构函数里调用虚函数. 构造函数不能声明为虚函数的原因? 构造一个对象时,必须知道对象 ...
- C++学习笔记-----不要在构造函数和析构函数中调用虚函数
考虑下面的程序: #include <iostream> using namespace std;class Base { public:Base() { cout << &q ...
- 构造函数中不应调用虚函数
今天调试程序,遇到一个很费解的问题,现在做个记录: class CS3Adapter : public CBaseAdapter 类CS3Adapter继承于CBaseAdapter,其中 CBase ...
- C++对象模型8——构造函数和析构函数中对虚函数的调用、全局对象构造和析构、局部static数组的内存分配
一.构造函数和析构函数中对虚函数的调用 仍然以https://blog.csdn.net/Master_Cui/article/details/109957302中的代码为例 base3构造函数和析构 ...
- 为什么构造函数不能声明为虚函数,析构函数可以,构造函数中为什么不能调用虚函数?
为什么构造函数不能声明为虚函数,析构函数可以,构造函数中为什么不能调用虚函数 构造函数中为什么不能调用虚函数? 第一个理由是概念上的 第二个理由是机械上的. 构造函数不能声明为虚函数的原因是 1 构造 ...
最新文章
- 实现对学生信息的修改操作
- Java中的享元设计模式,涨姿势了!
- 面试必问,如何控制多个线程的执行顺序
- hdu1847(博弈论:sg函数)
- 电脑基础操作_苹果电脑基础操作,和使用须知
- 如何获取当前C#程序所有线程的调用栈信息 ?
- windows功能_这 12 个好用 Windows 软件,让你也能用上 macOS 的独占功能
- Qt图形界面编程入门(3)
- 打开Excel文件时出现提示:“向Excel发送命令时出现错误”解决方案
- 小区进入刷卡,快递不方便
- 关于eclipse编译出错,缺失tools.jar 1.8
- VS2017注册之找不到输入key的地方的解决方法
- 什么是数据标准化、中心化、归一化?SPSS又如何实现?
- 亚马逊智能音箱无故发出笑声,多名用户被吓尿
- 培训班出身的程序员为什么遭人嫌弃
- 台式低速常温离心机S400操作规程
- 医院公厕智能化管理需要实现哪些功能
- QorIQ LX2160A安全引擎操作模式
- IDEA系列:最新IntelliJ IDEA下载地址(社区版和专业版)
- 平面最近点对问题求解—基于Java语言
热门文章
- 基于Mixin Network的PHP比特币开发教程 之一:创建机器人
- IE下的优秀js调试工具Companion.JS
- Alibaba Cluster Data 开放下载:270GB 数据揭秘你不知道的阿里巴巴数据中心
- es6学习笔记2-—symbol、变量与作用域
- 模板模式(TemplateMethod)和策略(StrategyMethod)模式
- 黑客常用SQL注入绕过技术总结!
- gRPC 网关,针对 HTTP 2.0 长连接性能优化,提升吞吐量
- 面试官:你们Redis故障过吗,怎么解决?
- 一文读懂Spring中的AOP机制
- 图解 | 搞定分布式,程序员进阶之路