首页 > 其他分享 >基类的析构函数需要virtual

基类的析构函数需要virtual

时间:2023-09-19 10:03:13浏览次数:33  
标签:cout virtual 析构 基类 destroy public


基类的析构函数需要virtual,如果不是virtual 那么delete时将不会调用派生类的析构函数(可能会存在内存泄露)

如下:

class A
 {
 public:
~A()
{
cout << "destroy A\n";
}
 };
 class B:public A
 {
 public:
~B()
{
cout << "destroy B\n";
}
 };
 int _tmain(int argc, _TCHAR* argv[])
 {
A *a=new B;
delete a;
cin.get();
return 0;
 }

输出:destroy A


加上virtual
class A
 {
 public:
virtual ~A()
{
cout << "destroy A\n";
}
 };
 class B:public A
 {
 public:
~B()
{
cout << "destroy B\n";
}
 };
 int _tmain(int argc, _TCHAR* argv[])
 {
A *a=new B;
delete a;
cin.get();
return 0;
 }

输出:

destroy B

destroy A

标签:cout,virtual,析构,基类,destroy,public
From: https://blog.51cto.com/u_15487030/7521770

相关文章

  • Virtual Box 安装 Ubuntu 22.04 操作系统窗口过小,修改分辨率
    问题在VirtualBox安装Ubuntu操作系统时,默认给的800x600窗口太小,ubuntu22.04的安装按钮被遮挡,无法顺利执行安装引导。解决安装引导是一个窗口化程序,支持鼠标拖动。鼠标左键单击窗口标题栏,拖动窗口在桌面处右键,选择显示设置设置合适的分辨率,点击应用短暂黑屏后,界......
  • 为什么基类要写成虚析构
    由于多态的存在,而多态分为两种方式,第一种是基类指针指向子类堆区内存,第二种是基类引用指向子类对象,而父类不写成虚析构的话第一种就会出现以下问题(第二种子类析构仍然会被调用):释放掉基类指向的子类内存,并销毁父类指针时只会调用基类的析构函数,而不会调用子类的析构函数从而造成......
  • fedora-virtualbox
    目录VirtualBoxVirtualBoxhttps://www.linuxtechi.com/install-virtualbox-on-fedora-linux/#google_vignette......
  • python之virtualenv虚拟环境
    1.用途:虚拟环境将开发环境相互隔离(如版本),互相不影响.①.virtualenv创建一个虚拟化的python运行环境,安装所需的依赖,使不同项目之间相互不干扰.2.安装:pipinstallvirtualenvvirtualenv--version//检查是否安装成功,查看版本(1).加速镜像源:①.清华源:h......
  • C++ virtual关键字
    用来修饰父类中的函数:1、修饰父类中的普通函数:1#include<iostream>2#include<string>3#include<stdlib.h>45usingnamespacestd;67classbase8{9public:10voidfun1(){cout<<"thisisbase::fun1"<<endl;}......
  • 【Qt6】列表模型——抽象基类
    列表模型(ItemModel),老周没有翻译为“项目模型”,因为Project和Item都可以翻译为“项目”,容易出现歧义。干脆叫列表模型。这个模型也确实是为数据列表准备的,它以MVC的概念为基础,在原始数据和用户界面视图之间搭建桥梁,使两者可以传递数据(提取、修改)。Qt里面使用列表控制比较......
  • Windows安装虚拟机软件——VirtualBox
    1、VirtualBox简介VirtualBox号称是最强的开源免费虚拟机软件,它不仅具有丰富的特色,而且性能也很优异。它简单易用,可虚拟的系统包括Windows、MacOSX、Linux、OpenBSD、Solaris、IBMOS2甚至Android等操作系统。使用者可以在VirtualBox上安装并且运行上述的这些操作系统......
  • 手撕代码,实现String类的构造函数、拷贝构造函数、赋值构造函数以及析构函数
    #include<bits/stdc++.h>usingnamespacestd;classString{public:String(constchar*str=NULL){//普通构造函数cout<<"普通构造函数被调用"<<endl;if(str==NULL){data=newchar[1];*dat......
  • Oracle VM VirtualBox Ubuntu设置共享文件夹
    1、在windows系统中创建文件夹创建的这个文件夹最好选择在内存空间较大的磁盘中。否则会引起内存不足的困扰。在E盘中创建名为winshare的文件夹。2、设置共享文件夹打开OracleVMVirtualBox,点击设置。点击“共享文件夹”。点击加号。随后在共享文件夹路径中选择第一步......
  • C++将派生类赋值给基类
    在C/C++中经常会发生数据类型的转换,例如将int类型的数据赋值给float类型的变量时,编译器会先把int类型的数据转换为float类型再赋值;反过来,float类型的数据在经过类型转换后也可以赋值给int类型的变量。数据类型转换的前提是,编译器知道如何对数据进行取舍。例如:inta=......