一、引入

  • 如果通过一个基类指针申请一个派生类对象,那么在通过这个指针释放对象的时候,要求基类的虚函数是virtual的 。

二、虚析构函数

  • 使用方法和规则与虚函数一样

  • 格式要求:

    • 虚析构函数要求基类与派生类中的名称不一致

  • 只要基类的析构函数是虚函数,就能确保我们在释放指针时准确的运行哪个版本(基类or派生类)的析构函数

    • 如果基类指针指向于自己,那么delete的时候执行的就是自己的析构函数

    • 如果基类指针指向于派生类对象,那么delete的时候执行的就是派生类的析构函数(这个就是多态的性质,与执行虚函数的原理一样)

  • 如果基类的析构函数不是虚函数,则delete一个指向派生类对象的基类指针将产生未定义的行为

  • 与虚函数一样,如果基类的析构函数为virtual,那么派生类的析构函数也都是virtual的(即使是编译器默认合成的也是virtual的)

三、虚析构函数的其它注意事项

  • ①前面我们介绍过如果一个类需要析构函数,那么它同样需要拷贝和赋值操作。但是基类的虚析构函数并不遵循这个规则:一个基类总是需要析构函数,而且它能将析构函数设定为虚函数,此时,该析构函数为了成为虚函数而令内容为空,我们显然无法由此推断该基类还释放需要复制运算符或拷贝

C++:50---虚析构函数相关推荐

  1. C++继承中构造函数、析构函数调用顺序及虚析构函数

    首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数, ...

  2. unique函数_C++智能指针2:(虚?)析构函数(标准与实现的差异)

    只要是有良心的 C++ 教材,总是会苦心孤诣地告诫初学者,在继承关系中,应该把父类的析构函数定义成虚函数.这已然成为一条铁律,如果违背,不仅有内存泄漏的风险,在多继承情况下甚至会出现未定义行为.因此, ...

  3. C++对象模型7——类的成员函数、反汇编虚析构函数、RTTI、多态的开销

    一.类成员函数 class test { public:void myfunc(){}virtual void vfunc() {}static void sfunc() {} };void myfu ...

  4. C++编程进阶2(编译器在类内默认生成的函数讨论以及纯虚析构函数)

    三.编译器默认提供的类内函数讨论 1.当写下一个空类时,编译器会在必要的时候默认提供四个函数:构造.拷贝构造.operator=和析构函数,而且都是public的 class Empty{ }; 上述 ...

  5. 为什么一般要定义析构函数为虚析构函数

    没有使用虚析构函数可能会出现的问题: #include <iostream> #include <string> using namespace std;class A { p ...

  6. C++ 虚析构函数

    类型需要虚析构函数的另外一个特征 是该类型具有指针成员或引用成员.如果有指针成员和引用成员,则该类型通常需要实现析构函数以及拷贝操作. 通常,一个实现了析构函数的类型同时也需要实现拷贝构造函数与拷贝复 ...

  7. C++继承中析构函数 构造函数的调用顺序以及虚析构函数

    首先说说构造函数.大家都知道构造函数里就能够调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就能够调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数, ...

  8. C++中基类的析构函数为什么要用virtual虚析构函数

    知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定. 关于动态绑定的讲解,请参阅:  C++中的动态类型与动态绑定.虚函数.多态实现 正题 直接的讲,C++中基类采用virtual虚析构函数是 ...

  9. 多态基类与虚析构函数

    假设我们有一个基类A,很不幸的,A的析构函数是一个non-virtual.同时我们有一个派生类B,它派生自A. 我们定义了一个A类型指针,它指向的实际对象是B: A * ptr = new B; 然后 ...

  10. 【c++】28.虚析构函数、纯虚函数

    1.虚函数:在类的成员函数前面加virtual关键字的函数: 一般把虚函数定义在public区,方便在主函数中调用 如果一个类有一个虚函数,则该类就有一个虚函数列表,所有该类的对象都共享这个虚函数表: ...

最新文章

  1. c语言stm8变量存储类型,STM32存储资源分配解析
  2. 不出声也能命令Siri!康奈尔大学华人团队开发无声语言识别项链,中文英文都行...
  3. Tungsten Fabric SDN — 流量调试手段
  4. 读CLR via C#总结(4) 值类型的装箱和拆箱
  5. hdu 1087 最大递增和
  6. linux的vim显示E172,Linux命令:vim
  7. LABLEME UPDATE DAMOD
  8. Pytorch(7)-自己设计神经网络会遇到的问题
  9. SQL 使用总结二 ( 不同库的日期总结)
  10. Web图形开发方案选型,SVG/VML/Flash/Applet优劣比较
  11. github如何同步fork到自己仓库的代码
  12. Android API之android.view.View.MeasureSpec
  13. adb连接手机出现Connection refused
  14. 机器人教练SWOT分析_用SWOT方法分析中国智能机器人的发展现状
  15. linux判断网卡能否上网,网卡坏了有什么现象?判断网卡是否坏了的方法
  16. 【Proteus仿真】HC-SRF04超声波测距传感器数码管显示
  17. 【Verilog 语法】~ 关键字、运算符、数据类型、缩位运算、三态门设计、可综合、VHDL 的结构、VHDL:WAIT 语句格式、原语、编译预处理
  18. 【财富空间】大风向!未来十年的12个必然趋势
  19. linux执行icemcfd脚本,Workbench中直接调用ICEM CFD进行网格划分
  20. 电脑显卡驱动需要java,电脑显卡驱动程序在什么地方下载更安全

热门文章

  1. 三角形和矩形傅里叶变换_信号与系统:第三章傅立叶变换2.ppt
  2. hssfcolor 不建议使用_不建议使用微信双开的真正原因!
  3. bbb sdk6编译流程
  4. Asterisk权威指南/第三章 安装Asterisk
  5. java如何添加进程_如何创建一个进程,如何进程调用进程
  6. python迭代器创建序列_Python 中迭代器与生成器实例详解
  7. gcovr 安装_Kudu 1.8.0 编译安装配置
  8. 神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(安装TensorFlow2.0)
  9. 面向对象软件开发代码结构(1)
  10. 通俗彻底解读批处理的延迟变量