C++继承中析构函数 构造函数的调用顺序以及虚析构函数
首先说说构造函数。大家都知道构造函数里就能够调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就能够调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数,仅仅有这样子类才干在构造函数里使用基类的成员,所以是创建子类时先调用基类的构造函数然后再调用自己的构造函数。通俗点说,你要用某些物品。但这些物品你没办法自己生产,自然就要等别人生产出来,你才干拿来用。
接着就是析构函数了,上面说到子类是将基类的成员变成自己的成员,那么基类就会仅仅存在子类中直到子类调用析构函数后。做个如果:假如在基类的析构函数调用比子类的先。这样会发生什么事呢?类成员终止了,而类本身却还在,可是在类存在的情况下。类成员就应该还存在的,这不就产生矛盾了吗?所以子类是调用自身的析构函数再调用基类的析构函数。基类的析构函数必须设置为虚的,而作为终于子类则能够是虚的也能够不是虚的,由于没有其它类继承于它不会影响终于功能。但又不是全部类的析构函数都设置为虚的比較好。由于存在虚函数的类实例化时会额外加入一个虚表指针。浪费内存性能。
如今到了虚函数了。virtual主要作用是在多态方面,而C++的多态最基本的是类的动态绑定,动态绑定则是指将子类的指针或引用转换成基类,基类对象就能够动态推断调用哪个子类成员函数。
这就说明在没有子类指针或引用转换为基类对象的话。virtual没有存在意义(纯虚函数除外)。也就是有没有virtual都是调用其自身的成员函数。通过这些分析,对于virtual就有了眉目了。
当子类指针或引用转换为基类时,若基类中实用virtual定义的函数,被子类重写后。此基类对象就会依据子类调用子类中的重写后的函数,而不是基类中的函数;反之,若是基类中没实用virtual定义,则无论基类被赋值的是哪个子类的值,调用的都是基类的成员函数(当然指的值子类重载的基类函数,不然就算要调用子类特有的成员函数也会编译只是)。
存在虚析构函数为什么不会存在虚构造函数呢?
构造函数不能是虚函数,由于构造子类时本身也是调用的子类构造函数,然后子类构造函数会调用基类构造函数。所以虚构造函数的存在是没有意义的。
仅仅有在构造完毕后,对象才干成为一个类的名符事实上的实例。
另外,静态成员函数和内联函数也不能是虚函数。
虚函数是针对对象的,不是针对类的.
这一点能够从类成员函数(即静态成员函数)不能是虚函数看出来.倘若类不被实例化为对象,虚函数的存在本身也没意义.
上面的如果我感觉并不认可,派生类中的构造,析构能够调用到基类的构造析构是由编译器编译中实现的.即:在子类构造函数开头自己主动加入默认的基类构造函数或初始化列表中指定的基类构造函数调用;在子类析构函数末尾自己主动加入其基类析构函数调用.
至于为什么会先调用基类构造函数再调用子类构造函数,先调用子类析构函数再调用基类析构函数.我觉得:由于仅仅可能出现子类中成员依赖基类成员的存在而存在,而不会出现基类中成员依赖子类成员存在.比如:子类中有一个成员是基类中一个指针成员所指向对象的引用.则这样的情况下倘若没有先调用基类构造函数对其指针成员初始化创建对象.那子类引用初始化时便不知会指向何处.相同析构时倘若先调用基类将当中的对象释放后,此时子类中引用变量在做一下善后处理时也便没有不论什么意义,因而其指向对象已经释放掉了.
派生类对象中基类成员先于子类成员存在,后于子类对象消失.
C++继承中析构函数 构造函数的调用顺序以及虚析构函数的更多相关文章
- C++ 构造函数和析构函数的调用顺序、虚析构函数的作用
构造函数和析构函数的调用顺序 构造函数的调用顺序: 当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达最底层的目标派生类的构造函数为止. 析构函数的调用书序: ...
- C++类继承中的构造函数和析构函数 调用顺序
思想: 在C++的类继承中,构造函数不能被继承(C11中可以被继承,但仅仅是写起来方便,不是真正的继承) 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时, ...
- java基础课程笔记 static 主函数 静态工具类 classpath java文档注释 静态代码块 对象初始化过程 设计模式 继承 子父类中的函数 继承中的构造函数 对象转型 多态 封装 抽象类 final 接口 包 jar包
Static那些事儿 Static关键字 被static修饰的变量成为静态变量(类变量) 作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 1.被static修饰后的成员变量只有一份 2.当成员 ...
- C++复习14 构造函数初始化调用顺序
1.关于构造函数初始化调用顺序的问题. 首先是父类和子类的,首先调用父类的构造函数,然后调用子类的构造函数.但是对于子类中有其他类型的数据成员的时候,会在调用该类的构造函数之前,调用其数据成员的构造函 ...
- C++语法小记---继承中的构造和析构顺序
继承中构造和析构的顺序 先父母,后客人,最后自己 静态变量和全局变量在最开始 析构和构造的顺序完全相反 #include <iostream> #include <string> ...
- (C++)C++类继承中的构造函数和析构函数
思想: 在C++的类继承中, 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时,其顺序正好与构造相反: 例子: #include <iostream& ...
- C++中复制构造函数被调用的三种情况
C++中的构造函数 c++中的构造函数分为构造函数,和复制构造函数,相比于构造函数,复制构造函数使用更加方便,快捷.构造函数可以有多个,二复制构造函数只能有一个,因为复制构造函数的参数只能是当前类的一 ...
- java继承的对象中构造函数的调用顺序
建立两个继承关系的对象 public class Machine { public String machieNameString; public Machine() { System.out.pri ...
- python类继承中构造子的调用
python面向对象中的继承关系中,子类对父类的构造方法的调用有两种方法: 父类名.__init__(self,参数) #注意名字是父类 super(本子类名,self)__init__(其他参数) ...
随机推荐
- spark transform系列__sortByKey
该函数主要功能:通过指定的排序规则与进行排序操作的分区个数,对当前的RDD中的数据集按KEY进行排序,并生成一个SHUFFLEdrdd的实例,这个过程会运行shuffle操作,在运行排序操作前,sor ...
- Log使用
学习参考:http://blog.csdn.net/hu_shengyang/article/details/6754031 log4j三种主要组件: logger记录对象 appender输出对象 ...
- Linux3.5内核以后的路由下一跳缓存
在Linux3.5版本号(包括)之前.存在一个路由cache.这个路由cache的初衷是美好的,可是现实往往是令人遗憾的.下面是陈列得出的两个问题:1.面临针对hash算法的ddos问题(描写叙述该问 ...
- cocos2d-x之浅析Hello World
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- tensorflow利用预训练模型进行目标检测(二):预训练模型的使用
一.运行样例 官网链接:https://github.com/tensorflow/models/blob/master/research/object_detection/object_detect ...
- weblogic管理脚本
start.sh Java代码 #!/usr/bin/bash # # start.sh # @auth: zhoulin@lianchuang.com # SERVER_STATUS () { s ...
- USACO 2.1 Healthy Holsteins
Healthy HolsteinsBurch & Kolstad Farmer John prides himself on having the healthiest dairy cows ...
- html5 好用功能总结
1.表格元素 a.<caption>设置表格标题 b.<colgroup> . <col> 设置列 //style span 2.分组元素 a.<blockq ...
- javascript中DOM基础知识介绍
1.1. 基本概念 1.1.1. DOM DOM Document Object Model 文档对象模型 就是把HTML文档模型化,当作对象来处理 DOM提供的一系列属性和方法可以 ...
- Maintain Aspect Ratio Mixin
Maintain Aspect Ratio Mixin Maintain the aspect ratio of a div with CSS RESPONSIVE ASPECT RATIOS WIT ...