个人对继承理解以及虚析构函数的理解
今天又从新研究了下继承和重载,感觉又有新的体会。
首先是对继承的理解,继承简单的说就是把基类的东西保留下来(一般都是public继承,这样基类中的public成员继承过来后还是public,基类中的protected成员继承过来后为protected,private成员派生类也无法访问)。这样就达到了代码复用的效果,派生类继承了基类的各个成员及方法。对于派生类来说,如果需要新的成员或者方法,可以在类中添加新的成员和方法,但要注意新添加的成员要进行初始化。
对于一个继承类定义对象。首先是先自动调用的是基类的默认构造函数(如果在派生类中手动调用基类的构造函数如:C::C(int a, int b):B(a), m1(b) ,则不去调用默认的构造函数而是其他构造函数在这里是B(a)),接着系统会调用派生类的构造函数,这样就产生了继承类的对象。
对于程序来说,程序结束的时候析构很重要,如果析构无法正常完成,将造成大量的资源浪费。然而对于继承来说,析构又是一个什么样的过程呢?通过实验,我发现,派生类对象的析构首先调用派生类析构函数,接着调用基类析构函数。
我是这样理解的。
对于调用析构函数先后问题:程序的运行是将每句指令调入内存中,以压栈的方式存入栈中,对于先声明的成员必定后析构,即先入后出,比如定义了两个变量human man; student stu; 那么系统先析构stu后析构man。同理对于派生类的对象,先调用了基类的构造后调用了继承类的构造,所以在析构的时候先“弹出”继承类的析构,后“弹出”基类的析构。
除此之外,我们学习继承的时候总是要设置基类的析构函数为虚函数,这是为什么呢?对于虚函数来说具有动态链编的能力,当一个基类指针指向派生类的对象时,析构该对象,如果没有虚函数,则不会运行派生类的析构函数,而是运行基类的析构函数,另外当函数覆盖时没有定义成虚函数,则不会对调用派生类对应的函数。也就是说,当析构函数不是虚函数时,此类对象的析构无法掉要派生类的析构,则会出现内存泄露的现象。
另外多说一句:虚具有传递性
转载于:https://www.cnblogs.com/javaexam2/archive/2012/02/26/2632867.html
个人对继承理解以及虚析构函数的理解相关推荐
- C++中的虚析构函数
Cpp中的虚析构函数 1.虚析构函数的作用:为了避免内存泄漏,而且是当子类中会有指针成员变量时才会使用到.即虚析构函数使得在删除指向子类对象的基类指针时,可以调用子类的析构函数来实现释放子类中堆内存的 ...
- C++继承中构造函数、析构函数调用顺序及虚析构函数
首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数, ...
- C++虚继承中构造函数和析构函数顺序问题以及原理
多重继承的问题:多个类B,C,-继承同一个类A导致如果X继承了B,C,-那么在X中将还有多个A中成员的拷贝,如果想要访问A中的成员如果不加名字空间将会导致二义性,这种拷贝大多是没有实际意义的,为了避免 ...
- C++继承中析构函数 构造函数的调用顺序以及虚析构函数
首先说说构造函数.大家都知道构造函数里就能够调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就能够调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数, ...
- 类5-类的继承、虚函数、纯虚函数、虚析构函数
一.类的继承 就像家谱一样,就是一个继承图.爷爷-父亲-儿子-孙子等.类也一样,上面的类称为基类,也称父类.基类下面的类叫子类也叫派生类. 子类对父类的一些属性等有所继承也有所发展,因此才有了类的继承 ...
- c++ map 析构函数_C++|类继承关系中的虚函数、虚析构函数、虚基类
在继承关系中,虚函数.虚析构函数.虚基类中使用的关键字virtual都是在告诉编译器,此处要进行特殊处理: 虚函数:函数重写时的要求编译器动态绑定来实现多多态 : 虚析构函数:当基类指针指向在堆内实现 ...
- c++远征之继承篇——隐藏,isa,虚析构函数
一.隐藏 父子关系. 成员(数据成员或者成员函数)同名: 此时子类中会隐藏父类中的同名成员. 无法函数重载,只会隐藏! 如果想访问父类中的同名成员,需要 :: 操作. 访问父类同名函数的方法 二.is ...
- 继承和多态二:虚析构函数
虽然我们已经知道了什么是继承和多态,也明白了多态依赖于继承,但是在多态中存在哪些问题呢? 多态中可能存在的内存泄露问题 例如下面的程序中,在圆形Circle的类中定义一个圆心的坐标,并且坐标是在堆中申 ...
- C++工作笔记-虚函数、纯虚函数、虚析构函数的进一步理解
虚函数: 1.带virtual关键字: 2.父类有定义,并且有功能,子类继承后可以重写这个功能(在Qt中经常见到 父类::此函数(参数)进行父类的调用,这样做是为了把父类的逻辑"继承&quo ...
最新文章
- 工作5年才有自己博客...汗...
- AI 三大教父齐聚深度学习峰会,讨论尖端研究进展
- (0085)iOS开发之OC与JS交互高级用法(JavaScriptCore)
- Java实现算法导论中朴素字符串匹配算法
- centos yum安装nginx 提示 No package nginx available问题解决方法
- tensorflow中GPU的设置
- 1.10 长短期记忆(LSTM)
- ThinkPHP5旅游管理系统
- 用类描述计算机中cpu的速度和硬盘容量,用类描述计算机中CPU的速度和硬盘的容量。要求Java的应用程序有4个类,名字分别是PC、CPU、HardDisk和Test,其中Test是主类。...
- 中国天气预报API城市编号
- 修改FTP和MSTSC默认端口号
- MTK6577+Android之Camera驱动
- 信安知识竞赛培训笔记
- 回顾 | Tencent Serverless Hours 线上分享会第一期
- java 用户态_内核启动用户态的程序 - 但行好事 莫问前程 - JavaEye技术网站
- 计算机怎么更换硬盘,怎么给台式电脑替换新硬盘?
- 解决zipimport.ZipImportError: can‘t decompress data; zlib not available make
- Mysql8存储GIS数据,QGIS中显示
- 会声会影2020下载免费版序列号激活码
- acl 影响因子_[转]本专业部分国际会议及刊物影响因子排名
热门文章
- T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst、语言版本影响...
- DSP学习初阶的一些笔记
- DDR读写简介及相关
- linux中cut -c命令,linux中~/cut/argus/
- MySQL安装后第一次修改密码
- 良好的编码习惯 —— 5 个提高代码质量的技巧
- Spring之DAO二
- Git 远程分支的pull与push
- 基于SSM实现旅游酒店预定管理系统平台
- 为什么要假设变量为正态分布?