首先说说构造函数。大家都知道构造函数里就能够调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就能够调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数,仅仅有这样子类才干在构造函数里使用基类的成员,所以是创建子类时先调用基类的构造函数然后再调用自己的构造函数。通俗点说,你要用某些物品。但这些物品你没办法自己生产,自然就要等别人生产出来,你才干拿来用。



接着就是析构函数了,上面说到子类是将基类的成员变成自己的成员,那么基类就会仅仅存在子类中直到子类调用析构函数后。做个如果:假如在基类的析构函数调用比子类的先。这样会发生什么事呢?类成员终止了,而类本身却还在,可是在类存在的情况下。类成员就应该还存在的,这不就产生矛盾了吗?所以子类是调用自身的析构函数再调用基类的析构函数。基类的析构函数必须设置为虚的,而作为终于子类则能够是虚的也能够不是虚的,由于没有其它类继承于它不会影响终于功能。但又不是全部类的析构函数都设置为虚的比較好。由于存在虚函数的类实例化时会额外加入一个虚表指针。浪费内存性能。



如今到了虚函数了。virtual主要作用是在多态方面,而C++的多态最基本的是类的动态绑定,动态绑定则是指将子类的指针或引用转换成基类,基类对象就能够动态推断调用哪个子类成员函数。

这就说明在没有子类指针或引用转换为基类对象的话。virtual没有存在意义(纯虚函数除外)。也就是有没有virtual都是调用其自身的成员函数。通过这些分析,对于virtual就有了眉目了。

当子类指针或引用转换为基类时,若基类中实用virtual定义的函数,被子类重写后。此基类对象就会依据子类调用子类中的重写后的函数,而不是基类中的函数;反之,若是基类中没实用virtual定义,则无论基类被赋值的是哪个子类的值,调用的都是基类的成员函数(当然指的值子类重载的基类函数,不然就算要调用子类特有的成员函数也会编译只是)。

存在虚析构函数为什么不会存在虚构造函数呢?

构造函数不能是虚函数,由于构造子类时本身也是调用的子类构造函数,然后子类构造函数会调用基类构造函数。所以虚构造函数的存在是没有意义的。

仅仅有在构造完毕后,对象才干成为一个类的名符事实上的实例。

另外,静态成员函数和内联函数也不能是虚函数。

虚函数是针对对象的,不是针对类的.

这一点能够从类成员函数(即静态成员函数)不能是虚函数看出来.倘若类不被实例化为对象,虚函数的存在本身也没意义.

上面的如果我感觉并不认可,派生类中的构造,析构能够调用到基类的构造析构是由编译器编译中实现的.即:在子类构造函数开头自己主动加入默认的基类构造函数或初始化列表中指定的基类构造函数调用;在子类析构函数末尾自己主动加入其基类析构函数调用.



至于为什么会先调用基类构造函数再调用子类构造函数,先调用子类析构函数再调用基类析构函数.我觉得:由于仅仅可能出现子类中成员依赖基类成员的存在而存在,而不会出现基类中成员依赖子类成员存在.比如:子类中有一个成员是基类中一个指针成员所指向对象的引用.则这样的情况下倘若没有先调用基类构造函数对其指针成员初始化创建对象.那子类引用初始化时便不知会指向何处.相同析构时倘若先调用基类将当中的对象释放后,此时子类中引用变量在做一下善后处理时也便没有不论什么意义,因而其指向对象已经释放掉了.
派生类对象中基类成员先于子类成员存在,后于子类对象消失.

C++继承中析构函数 构造函数的调用顺序以及虚析构函数的更多相关文章

  1. C++ 构造函数和析构函数的调用顺序、虚析构函数的作用

    构造函数和析构函数的调用顺序 构造函数的调用顺序: 当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达最底层的目标派生类的构造函数为止. 析构函数的调用书序: ...

  2. C++类继承中的构造函数和析构函数 调用顺序

    思想: 在C++的类继承中,构造函数不能被继承(C11中可以被继承,但仅仅是写起来方便,不是真正的继承) 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时, ...

  3. java基础课程笔记 static 主函数 静态工具类 classpath java文档注释 静态代码块 对象初始化过程 设计模式 继承 子父类中的函数 继承中的构造函数 对象转型 多态 封装 抽象类 final 接口 包 jar包

    Static那些事儿 Static关键字 被static修饰的变量成为静态变量(类变量) 作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 1.被static修饰后的成员变量只有一份 2.当成员 ...

  4. C++复习14 构造函数初始化调用顺序

    1.关于构造函数初始化调用顺序的问题. 首先是父类和子类的,首先调用父类的构造函数,然后调用子类的构造函数.但是对于子类中有其他类型的数据成员的时候,会在调用该类的构造函数之前,调用其数据成员的构造函 ...

  5. C++语法小记---继承中的构造和析构顺序

    继承中构造和析构的顺序 先父母,后客人,最后自己 静态变量和全局变量在最开始 析构和构造的顺序完全相反 #include <iostream> #include <string> ...

  6. (C++)C++类继承中的构造函数和析构函数

    思想: 在C++的类继承中, 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时,其顺序正好与构造相反: 例子: #include <iostream& ...

  7. C++中复制构造函数被调用的三种情况

    C++中的构造函数 c++中的构造函数分为构造函数,和复制构造函数,相比于构造函数,复制构造函数使用更加方便,快捷.构造函数可以有多个,二复制构造函数只能有一个,因为复制构造函数的参数只能是当前类的一 ...

  8. java继承的对象中构造函数的调用顺序

    建立两个继承关系的对象 public class Machine { public String machieNameString; public Machine() { System.out.pri ...

  9. python类继承中构造子的调用

    python面向对象中的继承关系中,子类对父类的构造方法的调用有两种方法: 父类名.__init__(self,参数) #注意名字是父类 super(本子类名,self)__init__(其他参数) ...

随机推荐

  1. jboss final 7.1.1相关error以及解决方式

    问题1 报错提示: MSC00001: Failed to start service jboss.web.deployment.default-host./: Caused by: java.lan ...

  2. ios Button

    展现效果例如以下: 功能说明: 1加入来图片背景, 2动态展现百度网页, 3动态加入button. 4展现提示框.展现你点击提示框得index  我成功来你也快来试试. 1 详细得项目创建与拖动but ...

  3. 杂项-DB:DW/DWH(数据仓库)

    ylbtech-杂项-DB:DW/DWH(数据仓库) 数据仓库,英文名称为Data Warehouse,可简写为DW或DWH.数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合. ...

  4. 修改mysql连接的密码

    mysql8.0修改密码: ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的password'; msyql开启实现 ...

  5. 阿里云主机ssh 免密码登录

    云主机配置: 操作系统: CentOS 7.0 64位CPU: 1 核公网IP: 78.129.23.45用户名: root密码:bugaosuni 本地环境:我在VMware下安装的Ubuntu 1 ...

  6. TimSort学习资料

    深入理解 timsort 算法(1):自适应归并排序 如何找出Timsort算法和玉兔月球车中的Bug? Java TimSort算法 源码 笔记 Timsort https://en.wikiped ...

  7. ValueProvider核心的值提供系统

    Model绑定的数据具有多种来源: 提交的表单 Json字符串 当前路由数据 请求地址的查询字符串 ASP.NET MVC将这种基于不同数据来源的数据提供机制实现在ValueProvider的组件中 ...

  8. P2740 [USACO4.2]草地排水Drainage Ditches

    题目背景 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没 ...

  9. IE8不支持响应式设计解决方法

    下载并引入 respond.js 即可 为了针对IE8应用这段脚本,需要针对IE8的条件注释 <!--[if lt IE 9]> --- <! [endif]--> 为了不让并 ...

  10. STL中的迭代器的使用

    package com.text; import java.lang.reflect.Field;import java.util.ArrayList;import java.util.Iterato ...