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__(其他参数) ...
随机推荐
- Android自己定义控件系列三:自己定义开关button(二)
接上一篇自己定义开关button(一)的内容继续.上一次实现了一个开关button的基本功能.即自己定义了一个控件.开关button,实现了点击切换开关状态的功能.今天我们想在此基础之上.进一步实现触 ...
- python绘制caffe中网络模型
caffe-master/python/draw_net.py 实现绘制caffe中定义的网络模型功能,将.prototxt文件可视化. 需要先安装pydot和protobuf工具 通过Anacond ...
- 30.QT IDE编写
mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTe ...
- golang sftp传输文件
之前有一篇介绍如何使用 golang 通过SSH协议来执行远程命令:golang执行远程命令 同样,通过SSH协议也可以使用 golang 来远程传输文件. 除了 SSH 的库,为了传输文件,还需要用 ...
- 搭建简单的Habernate环境(一)
一.开篇 下载Habernate所需要的jar包和mysql驱动. 二.建立java项目并且导入所需要的包 三.建立实体类和配置映射文件 user实体类 package testPackage; pu ...
- 敬请关注 Linr 公众号
- Android 中的View与ViewGroup
Android重点知识--View和ViewGroup与自定义控件 作者:丁明祥 邮箱:2780087178@qq.com 一.基础 ViewGroup 参考资料: Android 手把手教您自定义V ...
- ZBrush破解版真的好用么?
安装ZBrush®的时候是不是经常出现各种奇葩问题,使用ZBrush时候是不是经常出现停止工作状况,究其原因,原来都是破解搞的鬼.ZBrush破解版你还敢用么? 随着国人对版权的重视,越来越多的制作商 ...
- Json扩展 (转)
https://www.newtonsoft.com/json https://www.cnblogs.com/BrokenIce/p/5902441.html https://blog.csdn.n ...
- 第十二章 Python网络编程
socket编程 socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket ...