博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[C++基础]023_为什么要将基类的析构函数声明为Virtual?
阅读量:4625 次
发布时间:2019-06-09

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

 
1 #include 
2 using namespace std; 3 4 class Father{ 5 6 public: 7 ~Father(){ 8 cout<<"Father's Desconstruct Called."<

上面的代码,用父类指针指向new出来来的之类对象,这样是没问题的,接着,对这个父类指针变量进行了delete操作。上面的输出结果是什么呢?

Father's Desconstruct Called.

可见,子类的析构函数没有被调用,那如果子类中new了内存,那么那块内存就丢了。如何保证在删除父类指针的时候,子类的析构函数也被调用呢?看如下代码:

1 #include 
2 using namespace std; 3 4 class Father{ 5 6 public: 7 virtual ~Father(){ 8 cout<<"Father's Desconstruct Called."<

输出是什么呢?

Son's Desconstruct Called.Father's Desconstruct Called.

这就是动态联编的析构函数,至于为什么这样就可以调用子类的析构函数了,这就牵涉到另一个概念:虚函数表。具体请参照:

 

 你好,基类又叫父类,派类就是子类。是类的三大关系中的继承。通过子类继承父类,并判断继承关系,一般常用都为public公有继承,父类的所有public下的属性和方法可以被子类直接使用。也可以在子类中定义新的属性和方法。

 

 

转载于:https://www.cnblogs.com/xiao-wei-wei/archive/2013/03/19/2969158.html

你可能感兴趣的文章
Modified Least Square Method and Ransan Method to Fit Circle from Data
查看>>
JavaScript显示星期几
查看>>
thinkphp5命名规范
查看>>
设计模式六大原则
查看>>
centos7 --ngnix 常用命令:
查看>>
flask+jsonp跨域前后台交互(接口初体验)
查看>>
Eclipse+Maven+springmvc+HelloWorld--Eclipse Maven springMVC第一个HelloWorld吐血配置整理
查看>>
传Windows 8.1系统将重新加入开始按钮
查看>>
C# 自定义异常的方法源码演示及说明
查看>>
输出与输出:putchar() getchar() printf() scanf() puts() gets() sscanf()
查看>>
文档翻译-Minimizing your app's Memory Footprint
查看>>
[Unity优化]批处理01:Statistics窗口
查看>>
自然数的拆分(DFS)
查看>>
nodejs websocket
查看>>
SQLAlchemy_定义(一对一/一对多/多对多)关系
查看>>
添加远程库
查看>>
iOS Animation 学习(3)
查看>>
正则化方法:L1和L2 regularization、数据集扩增、dropout
查看>>
Hadoop学习笔记3---安装并运行Hadoop
查看>>
ASP.NET MVC性能优化(实际项目中)
查看>>