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

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

作用:作为基类使用的类应该具有虚析构函数,以保证在删除基类指针(动态分配的对象)时。依据指针实际指向的对象进行适当的析构。

请看以下这段代码;

#include 
class A{ public: A(){ std::cout << "A constructor execute" << std::endl; } ~A(){ std::cout << "A destructor execute" << std::endl; } virtual void doSomething(){ std::cout << "A dosomething" << std::endl; }};class B : public A{ public: B(){ std::cout << "B constructor execute" << std::endl; } ~B(){ std::cout << "B destructor execute" << std::endl; } void doSomething(){ std::cout << "B dosomething" << std::endl; }};int main(int argc, char** argv) { A *a = new B(); a->doSomething(); delete a; return 0;}
运行结果:

能够看到:B的析构函数式没有被运行的,这在平时的编程中是很危急的。

为了可以正确运行A和B的析构。我们将A的析构函数改为虚析构函数。

#include 
class A{ public: A(){ std::cout << "A constructor execute" << std::endl; } virtual ~A(){ std::cout << "A destructor execute" << std::endl; } virtual void doSomething(){ std::cout << "A dosomething" << std::endl; }};class B : public A{ public: B(){ std::cout << "B constructor execute" << std::endl; } ~B(){ std::cout << "B destructor execute" << std::endl; } void doSomething(){ std::cout << "B dosomething" << std::endl; }};int main(int argc, char** argv) { A *a = new B(); a->doSomething(); delete a; return 0;}
运行结果:
可见,此时能够先运行B的析构,再运行A的析构。

并非全部的析构函数都须要写成虚函数,由于当类中含有虚函数的时候,编译器会给类加入一个虚函数表,里面用来放虚函数指针,这样会添加类的储存空间。

你可能感兴趣的文章
amazon 面经2
查看>>
diff补丁格式
查看>>
jsp 基础知识之指令元素
查看>>
华为两年半——寂寞也是一种生活 (转)
查看>>
Java 强制类型转换(类转换注意事项)
查看>>
php 压缩文件 zip
查看>>
buz-java(十)
查看>>
Visual Studio 2010 SP1正式开放下载
查看>>
结构体数组的排序
查看>>
MongoDB数据库 : 管道,用户管理,副本集等
查看>>
【高级编程技术作业】第二周
查看>>
【转】网易内推测试开发岗面试经历
查看>>
webpack系统配置
查看>>
寻找数组中第二大数
查看>>
品牌搜索
查看>>
UVA 10817 十一 Headmaster's Headache
查看>>
PHP左侧菜单栏的管理与实现
查看>>
Docker学习笔记四:Docker镜像、容器管理工具shipyard
查看>>
Knockout.Js学习目录
查看>>
CecOS Virtualization
查看>>