今天又从新研究了下继承和重载,感觉又有新的体会。

首先是对继承的理解,继承简单的说就是把基类的东西保留下来(一般都是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

个人对继承理解以及虚析构函数的理解相关推荐

  1. C++中的虚析构函数

    Cpp中的虚析构函数 1.虚析构函数的作用:为了避免内存泄漏,而且是当子类中会有指针成员变量时才会使用到.即虚析构函数使得在删除指向子类对象的基类指针时,可以调用子类的析构函数来实现释放子类中堆内存的 ...

  2. C++继承中构造函数、析构函数调用顺序及虚析构函数

    首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数, ...

  3. C++虚继承中构造函数和析构函数顺序问题以及原理

    多重继承的问题:多个类B,C,-继承同一个类A导致如果X继承了B,C,-那么在X中将还有多个A中成员的拷贝,如果想要访问A中的成员如果不加名字空间将会导致二义性,这种拷贝大多是没有实际意义的,为了避免 ...

  4. C++继承中析构函数 构造函数的调用顺序以及虚析构函数

    首先说说构造函数.大家都知道构造函数里就能够调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就能够调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数, ...

  5. 类5-类的继承、虚函数、纯虚函数、虚析构函数

    一.类的继承 就像家谱一样,就是一个继承图.爷爷-父亲-儿子-孙子等.类也一样,上面的类称为基类,也称父类.基类下面的类叫子类也叫派生类. 子类对父类的一些属性等有所继承也有所发展,因此才有了类的继承 ...

  6. c++ map 析构函数_C++|类继承关系中的虚函数、虚析构函数、虚基类

    在继承关系中,虚函数.虚析构函数.虚基类中使用的关键字virtual都是在告诉编译器,此处要进行特殊处理: 虚函数:函数重写时的要求编译器动态绑定来实现多多态 : 虚析构函数:当基类指针指向在堆内实现 ...

  7. c++远征之继承篇——隐藏,isa,虚析构函数

    一.隐藏 父子关系. 成员(数据成员或者成员函数)同名: 此时子类中会隐藏父类中的同名成员. 无法函数重载,只会隐藏! 如果想访问父类中的同名成员,需要 :: 操作. 访问父类同名函数的方法 二.is ...

  8. 继承和多态二:虚析构函数

    虽然我们已经知道了什么是继承和多态,也明白了多态依赖于继承,但是在多态中存在哪些问题呢? 多态中可能存在的内存泄露问题 例如下面的程序中,在圆形Circle的类中定义一个圆心的坐标,并且坐标是在堆中申 ...

  9. C++工作笔记-虚函数、纯虚函数、虚析构函数的进一步理解

    虚函数: 1.带virtual关键字: 2.父类有定义,并且有功能,子类继承后可以重写这个功能(在Qt中经常见到 父类::此函数(参数)进行父类的调用,这样做是为了把父类的逻辑"继承&quo ...

最新文章

  1. 工作5年才有自己博客...汗...
  2. AI 三大教父齐聚深度学习峰会,讨论尖端研究进展
  3. (0085)iOS开发之OC与JS交互高级用法(JavaScriptCore)
  4. Java实现算法导论中朴素字符串匹配算法
  5. centos yum安装nginx 提示 No package nginx available问题解决方法
  6. tensorflow中GPU的设置
  7. 1.10 长短期记忆(LSTM)
  8. ThinkPHP5旅游管理系统
  9. 用类描述计算机中cpu的速度和硬盘容量,用类描述计算机中CPU的速度和硬盘的容量。要求Java的应用程序有4个类,名字分别是PC、CPU、HardDisk和Test,其中Test是主类。...
  10. 中国天气预报API城市编号
  11. 修改FTP和MSTSC默认端口号
  12. MTK6577+Android之Camera驱动
  13. 信安知识竞赛培训笔记
  14. 回顾 | Tencent Serverless Hours 线上分享会第一期
  15. java 用户态_内核启动用户态的程序 - 但行好事 莫问前程 - JavaEye技术网站
  16. 计算机怎么更换硬盘,怎么给台式电脑替换新硬盘?
  17. 解决zipimport.ZipImportError: can‘t decompress data; zlib not available make
  18. Mysql8存储GIS数据,QGIS中显示
  19. 会声会影2020下载免费版序列号激活码
  20. acl 影响因子_[转]本专业部分国际会议及刊物影响因子排名

热门文章

  1. T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst、语言版本影响...
  2. DSP学习初阶的一些笔记
  3. DDR读写简介及相关
  4. linux中cut -c命令,linux中~/cut/argus/
  5. MySQL安装后第一次修改密码
  6. 良好的编码习惯 —— 5 个提高代码质量的技巧
  7. Spring之DAO二
  8. Git 远程分支的pull与push
  9. 基于SSM实现旅游酒店预定管理系统平台
  10. 为什么要假设变量为正态分布?