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++中最好不要在构造函数和析构函数中调用虚函数!!!相关推荐

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

    C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数. (1) 构造函数不能为虚函数 让我们来看看大牛C++之父 Bjarne Stroustrup ...

  2. 构造函数与析构函数能否为虚函数?

    C++C++C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数. 1.构造函数不能为虚函数 让我们来看看大牛C++C++C++之父 BjarneB ...

  3. C++中最好不要在构造函数和析构函数中调用虚函数

    1.最好不要在基类和派生类的构造和析构函数中调用虚函数,不会出现多态性 实例如下: #include "iostream"using namespace std;class Bas ...

  4. C/Cpp / C++ 构造函数和析构函数可以是虚函数吗

    答案 构造函数不可以是虚函数,而析构函数可以且常常是虚函数. 原因 1.构造函数不可以是虚函数 当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表是一个存储成员函数指针的数据结构. 虚函数表 ...

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

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

  6. C++学习笔记-----不要在构造函数和析构函数中调用虚函数

    考虑下面的程序: #include <iostream> using namespace std;class Base { public:Base() { cout << &q ...

  7. 构造函数中不应调用虚函数

    今天调试程序,遇到一个很费解的问题,现在做个记录: class CS3Adapter : public CBaseAdapter 类CS3Adapter继承于CBaseAdapter,其中 CBase ...

  8. C++对象模型8——构造函数和析构函数中对虚函数的调用、全局对象构造和析构、局部static数组的内存分配

    一.构造函数和析构函数中对虚函数的调用 仍然以https://blog.csdn.net/Master_Cui/article/details/109957302中的代码为例 base3构造函数和析构 ...

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

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

最新文章

  1. 实现对学生信息的修改操作
  2. Java中的享元设计模式,涨姿势了!
  3. 面试必问,如何控制多个线程的执行顺序
  4. hdu1847(博弈论:sg函数)
  5. 电脑基础操作_苹果电脑基础操作,和使用须知
  6. 如何获取当前C#程序所有线程的调用栈信息 ?
  7. windows功能_这 12 个好用 Windows 软件,让你也能用上 macOS 的独占功能
  8. Qt图形界面编程入门(3)
  9. 打开Excel文件时出现提示:“向Excel发送命令时出现错误”解决方案
  10. 小区进入刷卡,快递不方便
  11. 关于eclipse编译出错,缺失tools.jar 1.8
  12. VS2017注册之找不到输入key的地方的解决方法
  13. 什么是数据标准化、中心化、归一化?SPSS又如何实现?
  14. 亚马逊智能音箱无故发出笑声,多名用户被吓尿
  15. 培训班出身的程序员为什么遭人嫌弃
  16. 台式低速常温离心机S400操作规程
  17. 医院公厕智能化管理需要实现哪些功能
  18. QorIQ LX2160A安全引擎操作模式
  19. IDEA系列:最新IntelliJ IDEA下载地址(社区版和专业版)
  20. 平面最近点对问题求解—基于Java语言

热门文章

  1. 基于Mixin Network的PHP比特币开发教程 之一:创建机器人
  2. IE下的优秀js调试工具Companion.JS
  3. Alibaba Cluster Data 开放下载:270GB 数据揭秘你不知道的阿里巴巴数据中心
  4. es6学习笔记2-—symbol、变量与作用域
  5. 模板模式(TemplateMethod)和策略(StrategyMethod)模式
  6. 黑客常用SQL注入绕过技术总结!
  7. gRPC 网关,针对 HTTP 2.0 长连接性能优化,提升吞吐量
  8. 面试官:你们Redis故障过吗,怎么解决?
  9. 一文读懂Spring中的AOP机制
  10. 图解 | 搞定分布式,程序员进阶之路