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++不会进行动态联编。
不要在析构函数中调用虚函数的原因:析构函数是用来销毁一个对象的,在销毁一个对象时,先调用子类的析构函数,然后再调用基类的析构函数。所以在调用基类的析构函数时,派生类对象的数据成员已经“销毁”,这个时再调用子类的虚函数已经没有意义了。

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. 在VMWare中配置SQLServer2005集群 Step by Step(四)——集群安装
  2. 【Fourier Convolution】傅里叶卷积
  3. 201521123031 《Java程序设计》第6周学习总结
  4. linux系统源配置(根据自己理解编写,不当之处,敬请指教)
  5. 网站假设php,PHP个人网站架设连环讲(一)
  6. 第四范式陈雨强:做机器学习平台天然就是新基建丨新基建50人
  7. C语言中“指针”和“指针变量”的区别是什么
  8. 有效的云安全态势始于三个步骤
  9. Autofac 依赖注入框架
  10. 苹果公布第三财季财报:大中华区依然是伤心地
  11. Android中的消息通知Toast和Notification
  12. python求小于n的所有素数_关于求N以内素数的python实现以及优化方法
  13. 反编译软件ILSpy的使用教程
  14. 绝地求生最新服务器维护,绝地求生更新维护公告最新:3月10日吃鸡停机维护多久 几点开始?...
  15. GAN生成手写字体识别
  16. SQL Server索引 - 聚集索引、非聚集索引、非聚集唯一索引 第八篇
  17. linux 的vim快速查找内容
  18. MYSQL 中连接的使用
  19. 全国计算机三级考试网络技术--应用题总结
  20. 70多岁老人学英语计算机,老人自学英语30年成老师 找外国游客练口语

热门文章

  1. java.util.Date和java.sql.Date之间的相互转换
  2. 关于ALTERA的FPGA的弱上拉问题
  3. CSS连载-控制背景与CSS精灵
  4. 牛客网-剑指offer 第二题(字符替换)
  5. php发送post请求方法
  6. 【数据结构与算法】之深入解析“删除有序数组中的重复项”与“移除元素”的求解思路与算法示例
  7. 227. 基本计算器 II
  8. pytorch慢到无法安装,该怎么办?
  9. Makefile 学习 1
  10. 2016年第七届蓝桥杯C/C++ A组国赛 —— 第三题:打靶