C++析构函数可虚性探究
C++虚析构函数
析构函数是用来释放对象所申请的资源的函数。 当类内没有自定义的析构函数时,系统会自动调用默认的析构函数。
那么析构函数能否为虚函数呢?
虚函数的意义在于实现“多态性”。即:不同的个体(派生类),实行(运行)不同的方法或策略。这样说来,析构函数本就可以是“虚”的。
那么,虚的析构函数的意义在哪里呢?
当一个类是既无父类又无派生类时,姑且称他为“孤独类”吧!并没有什么影响,编译器也不会报错。demo见下图例子:
但是,当此类为基类且存在基类指针指向派生类对象时,就要多加注意了!我们知道,虚函数是动态绑定,即运行时多态。析构时,子类先调用自己的析构函数,再调用父类的析构函数。
当父类(基类)的析构函数不为虚时,发生静态绑定,即编译时,指针绑定为父类指针,调用析构函数时,就只调用基类析构函数,子类(派生类)的析构函数不会被调用,会发生内存泄漏!!!
(这里就不上效果图了,大致就是,不断调用父类析构函数,内存泄漏了......)
结论
C++函数析构函数可以为虚
基类切记考虑虚析构函数
C++析构函数可虚性探究的更多相关文章
- 虚析构函数(√)、纯虚析构函数(√)、虚构造函数(X)
from:http://blog.csdn.net/fisher_jiang/article/details/2477577 一. 虚析构函数 我们知道,为了能够正确的调用对象的析构函数,一般要求具有 ...
- C++中为什么构造函数不能是虚函数,析构函数是虚函数
一, 什么是虚函数? 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语 ...
- 转 C++构造函数、析构函数、虚函数之间的关系
C++构造函数.析构函数.虚函数之间的关系 1. 如果我们定义了一个构造函数,编译器就不会再为我们生成默认构造函数了.2. 编译器生成的析构函数是非虚的,除非是一个子类,其父类有个虚析构,此时的函数虚 ...
- C++ 析构函数为虚函数
1.原因: 在实现多态时, 当用基类指针操作派生类, 在析构时候防止只析构基类而不析构派生类. 2.例子: (1). #include<iostream> using namespace ...
- C++构造函数、析构函数、虚析构函数
1.构造函数 C++中的构造函数是用于初始化类的各种变量以及分配资源等.主要的注意事项是: (1)在继承关系中先初始化父类对象后初始化子类对象. (2)在一个类中按照变量的声明顺序,对类中的变量进行初 ...
- C++中继承 声明基类析构函数为虚函数作用,单继承和多继承关系的内存分布
1,基类析构函数不为虚函数 #include "pch.h" #include <iostream> class CBase { public: CBase() { m ...
- C++ 构造函数、析构函数与虚函数的关系
编译环境:windows 10 + VS2105 1.构造函数不能为虚函数 虚函数的作用是为了实现C++多态机制.基类定义虚函数,子类可以重写该虚函数.当子类重写父类虚函数后,父类指针指向子类地址时, ...
- Flume-NG中Transaction并发性探究
我们曾经在Flume-NG中的Channel与Transaction关系(原创)这篇文章中说了channel和Transaction的关系,但是在source和sink中都会使用Transaction ...
- 虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?
五条基本规则: 1.如果基类已经插入了vptr, 则派生类将继承和重用该vptr.vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的 ...
随机推荐
- Kali学习笔记44:SQLMAP
SQLMAP漏洞检测技术: 1.基于布尔的盲注检测:' and 1=1 'and 1=2等 2.基于时间的盲注检测:' and (select * from (select(sleep(20))) ...
- [Swift]LeetCode253.会议室 II $ Meeting Rooms II
Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...
- [Swift]LeetCode561. 数组拆分 I | Array Partition I
Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1 ...
- [Swift]LeetCode639. 解码方法 2 | Decode Ways II
A message containing letters from A-Z is being encoded to numbers using the following mapping way: ' ...
- [Swift]LeetCode915.将分区数组分成不相交的间隔 | Partition Array into Disjoint Intervals
Given an array A, partition it into two (contiguous) subarrays left and right so that: Every element ...
- [Swift]LeetCode1018. 可被 5 整除的二进制前缀 | Binary Prefix Divisible By 5
Given an array A of 0s and 1s, consider N_i: the i-th subarray from A[0] to A[i] interpreted as a bi ...
- Java核心技术及面试指南 多线程部分的基本面试题总结以及答案
7.1.5 (1) 如果某个类已经继承(extends)了一个类,那么让这个类具有多线程的特性? implements runnable类或通过线程池 7.1.5 (2)启动一个线程是用run()还 ...
- PHP自动加载机制
类的载入共经历了三个阶段 第一阶段是面向过程式的做法,整个项目里到处都是include或require. 问题:难看,不易维护. . 第二阶段是魔术方法__autoload,当new一个类的时候,如果 ...
- 【ASP.NET Core快速入门】(四)在CentOS上安装.NET Core运行时、部署到CentOS
下载.NET Core SDK 下载地址:https://www.microsoft.com/net/download/windows 第一步:Add the dotnet product feed( ...
- RabbitMQ消息队列(十四)-启用SSL安全通讯
如果RabbitMQ服务在内网中,只有内网的应用连接,我们认为这些连接都是安全的,但是个别情况我们需要让RabbitMQ对外提供服务.这种情况有两种解决方案: 在RabbitMQ外层在封装一层应用,应 ...