博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
虚析构函数的作用
阅读量:4210 次
发布时间:2019-05-26

本文共 1890 字,大约阅读时间需要 6 分钟。

虚析构函数的作用就是用父类指针或者引用释放所有的子类资源。

 

在没有使用虚析构函数的情况下,因为c++是静态联编语言,其指针是什么类型,就默认为指针指向的是什么类型,因为这样做是绝对安全的,我也非常支持这种做法,但是,在有些时候,确是会出现问题,具体看如下代码:

#define _CRT_SECURE_NO_WARNINGS#include 
using namespace std;class A{public: A() { p = new char[20]; strcpy(p, "obja"); printf("A()\n"); } ~A() { delete [] p; printf("~A()\n"); }protected:private: char* p;};class B : public A{public: B() { p = new char[20]; strcpy(p, "objb"); printf("B()\n"); } ~B() { delete [] p; printf("~B()\n"); }protected:private: char* p;};class C : public B{public: C() { p = new char[20]; strcpy(p, "objc"); printf("C()\n"); } virtual ~C() { delete [] p; printf("~C()\n"); }protected:private: char* p;};void HowToDeleteA(A* base){ delete base;}void HowToDeleteB(B* base){ delete base;}int main(){ A* baseA = new C; B* baseB = new C; cout << "hello world" << endl; HowToDeleteA(baseA); //这个函数会输出 ~A(),不符合预期 HowToDeleteB(baseB); //这个函数会输出 ~B()和~A(), 不符合预期 return 0;}

在使用了虚析构函数只会,输出情况会变成如下所示:

#define _CRT_SECURE_NO_WARNINGS#include 
using namespace std;class A{public: A() { p = new char[20]; strcpy(p, "obja"); printf("A()\n"); } virtual ~A() { delete [] p; printf("~A()\n"); }protected:private: char* p;};class B : public A{public: B() { p = new char[20]; strcpy(p, "objb"); printf("B()\n"); } virtual ~B() { delete [] p; printf("~B()\n"); }protected:private: char* p;};class C : public B{public: C() { p = new char[20]; strcpy(p, "objc"); printf("C()\n"); } virtual ~C() { delete [] p; printf("~C()\n"); }protected:private: char* p;};void HowToDeleteA(A* base){ delete base;}void HowToDeleteB(B* base){ delete base;}int main(){ A* baseA = new C; B* baseB = new C; cout << "hello world" << endl; HowToDeleteA(baseA); //使用了虚析构函数,相当于调用delete C,输出: ~C,~B,~A (构造函数调用顺序与析构函数调用顺序正好相反) HowToDeleteB(baseB); //使用了虚析构函数,相当于调用delete C, 输出: ~C,~B,~A return 0;}

总之,虚析构函数的作用是使用父类指针或者引用释放所有的子类资源

转载地址:http://vrzmi.baihongyu.com/

你可能感兴趣的文章
Spring MVC与JAX-RS比较与分析
查看>>
openstack官方docker介绍
查看>>
Linux命令之chmod详解
查看>>
【java小程序实战】小程序注销功能实现
查看>>
(六) Git--标签管理
查看>>
建造者模式(Builder)-设计模式(三)
查看>>
Android——ImageSwitcher轮流显示动画
查看>>
Android——利用手机端的文件存储和SQLite实现一个拍照图片管理系统
查看>>
java反射详解
查看>>
JPA 注解
查看>>
JQuery 简介
查看>>
Java创建对象的方法
查看>>
Extjs自定义组件
查看>>
TreeGrid 异步加载节点
查看>>
Struts2 标签库讲解
查看>>
Google Web工具包 GWT
查看>>
材料与工程学科相关软件
查看>>
windows 下AdNDP 安装使用
查看>>
Project 2013项目管理教程(1):项目管理概述及预备
查看>>
ssh客户端后台运行
查看>>