首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从零开始学C++之继承(二):继承构造函数、派生转换

一、不能自动继承成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承构造函数 构造函数不被继承,派生中需要声明自己构造函数。...声明构造函数时,只需要对本类中新增成员进行初始化,对继承成员初始化调用构造函数完成(如果没有给出则默认调用默认构造函数)。...输出可以看出: 派生对象构造次序: 先调用对象成员构造函数,接着是构造函数,然后是派生对象成员构造函数,最后是派生自身构造函数。...初始化列表参数多个且其中有调用构造函数时,先执行构造函数(最远开始,如果多重继承则按继承顺序);其他对象成员若不止一个,则按定义顺序构造,与初始化列表顺序无关。...四、派生转换 当派生以public方式继承时,编译可自动执行转换(向上转型 upcasting 安全转换) 派生对象指针自动转化为对象指针 派生对象引用自动转化为对象引用

1.5K00
您找到你想要的搜索结果了吗?
是的
没有找到

【C++】继承 ⑧ ( 继承 + 组合 模式对象 构造函数 和 析构函数 调用规则 )

一、继承 + 组合 模式对象 构造函数和析构函数调用规则 1、场景说明 如果一个继承 , 又 在中 维护了一个 其它类型 成员变量 , 那么 该类 构造 与 析构 , 就需要涉及到... 本身 构造函数 和 析构函数 , 父 构造函数 和 析构函数 , 成员变量 构造函数 和 析构函数 ; 2、调用规则 在 继承 + 组合 情况下 , 构造函数 与 析构函数 调用规则如下...: 构造函数 : 父 -> 成员 -> 自身 ; 首先 , 调用 构造函数 ; 然后 , 调用 成员 构造函数 ; 也就是 成员变量 类型 构造函数 ; 最后 , 调用 自己 构造函数 ;...析构函数 ; 最后 , 调用 析构函数 ; 二、完整代码示例分析 ---- 1、代码分析 在下面的代码中 , 继承关系 : C 继承了 B class C : public B , B ...; A 和 B 构造函数 , 是 父构造函数 ; D 构造函数 , 是 成员构造函数 ; C 构造函数 , 是 自身构造函数 ; 构造函数调用顺序为 : 父 -> 成员 -> 自身 , 符合上述调用原则

15410

java之父构造是否能被子类继承

子类默认继承属性和方法,但不会继承构造,而是在子类被实例化时会默认调用构造。子类在创建时候会调用自己构造,并在空构造会隐式调用super(),即父构造。...如果父构造被重载,那么子类中构造也必须初始化父构造,否则会报编译错误。当然,只要父中显示定义了空构造,子类中就不必初始化父构造。...= name; } } 子类:Student.java package myjava; public class Student extends Person{ //这里必须初始化父重载后构造方法...System.out.println(personName); System.out.println(studentName); } 输出: tom jack 说明:此时父中没有显示定义空构造...,只有一个重载了构造,在子类构造中,必须初始化父构造,即super关键字+父构造参数。

1.2K20

Java继承重名static函数浅谈解析调用与分派

,当我们用父实例引用(实际上该实例是一个子类)调用static函数时,调用是父static函数。...原因在于方法被加载顺序。 当一个方法被调用时,JVM首先检查其是不是方法。如果是,则直接调用该方法引用变量所属中找到该方法并执行,而不再确定它是否被重写(覆盖)。...在重载过程中,编译根据方法参数静态类型(比如tc1静态类型是class1,tc2是class2,但本文这里不是重载!)来确定使用方法版本,这叫做静态分派。...动态分派是用于方法重写,比如我调用一个A方法f,如果该类有子类a,那么我以a来调用f时候,调用实际是a.f而非A.f。 看起来还真的像动态分派是不是?但是结果不符合啊!...在调用static方法时,编译就会直接在加载时把其符号引用解析为直接引用,不存在说子类找不到方法之后再去父找这种行为,所以也叫解析调用

1.2K30

、变量、块、构造继承初始化顺序,终极解答。

最近发现微信群里面有些群友在讨论初始化顺序,如静态变量、成员变量、静态代码块、非静态代码块、构造,及继承时,它们初始化顺序都是怎样,下面我通过例子来说明这个情况,以免被人误导。...field static block member field non-static block constructor 可以得出以下结论: 静态变量 > 静态初始块 > 成员变量 > 非静态初始块 > 构造...示例2:测试继承初始化顺序 class Parent { private static String parentStaticField = "parent static field";...> 父静态初始块 > 子类静态变量 > 子类静态初始块 > 父成员变量 > 父非静态初始块 > 父构造 > 子类成员变量 > 子类非静态初始块 > 子类构造 示例3:测试成员变量、初始块初始化顺序...从上面两个例子可以看出,父静态变量和静态初始块肯定是先于子类加载

67840

Swift 构造使用

阶段 2 顶部构造链一直向下, 每个构造链中指定构造都有机会进一步定制实例. 构造此时可以访问 self, 修改它属性并调用实例方法等等。...虽然子类不会默认继承来自父构造, 但是我们也可以通过别的方法来自动继承来自父构造, 构造继承就遵循以下规则: 如果子类没有定义任何指定构造, 那么会默认继承所有来自父指定构造...如果子类提供了所有父指定构造实现, 不管是通过 规则 1 继承过来, 还是通过自定义实现, 它将自动继承所有父便利构造....构造在第一阶段构造完成之前, 不能调用任何实例方法, 不能读取任何实例属性值,self 不能被引用. 继承相关 如果子类没有定义任何指定构造, 那么会默认继承所有来自父指定构造....如果子类提供了所有父指定构造实现, 不管是通过上一条规则继承过来, 还是通过自定义实现, 它将自动继承所有父便利构造.

1.7K20

Python|多重继承及super()调用

在python中有关子类多重继承所涉及问题。如super函数,若是多个子类继承自相同与不同会有什么不同?当子类存在多个父时,继承先后顺序是怎样?一起来探究一下其中规律。...__init__() 首先super函数会找到C(A),然后把C对象转化为父(A)对象,然后调用对象方法。...由上述分析及结果可以得到一个结论:当多重继承中存在多个子类同时继承相同时,且自身作为父时(C,D均为F),例如C,D两个子类同时去继承相同(A)时,利用super()函数只会在最后一个调用...图 2 结果 由此可见,当父变为不同时,super()就会分别调用各个父,并输出每一个调用,例子中C,D就会分别调用他们A和B,这样就会输出上述结果。...结语 涉及多重继承关系中super()函数并不是去让子类继承并输出,而是将自身,即子类对象转化为父对象并调用,明白这一点问题就迎刃而解了。 !

1.4K10

【Kotlin】Kotlin 继承 一 ( 继承基本方式 | final 关键字 | 子类主构造函数 | 子类次构造函数 )

继承基本方式 II . 使用 final 禁止继承 / 方法重写 III . 父没有主构造函数 IV . 父有主构造函数 V . 父构造函数与子类构造函数总结 I ....继承格式 : 使用 " : " 继承 ; 如果该父有主构造函数 , 那么子类必须至少有一个主构造函数或次构造函数 , 子类构造函数下面会根据不同情况详细解析 ; //注意这里构造函数需要实际调用...继承限制 : 子类使用 : 父 ( 父构造函数参数列表 ) ① 继承限制 : 只有被 open 修饰 , 才能有子类继承该类 , 普通不允许被继承 ; ② 方法被重写限制 : 只有被...子类有主构造函数 : 父必须在主构造函数中初始化 , 子类 constructor() 可以省略 ; " : " 后 Father() 相当于调用了父构造函数 , 将子类构造函数委托给父构造函数执行...子类没有主构造函数 : 如果没有主构造函数 , 那么子类必须有次构造函数 , 子类需要在次构造函数中定义需要变量 , 其中参数 , 可以直接传递给后面 super ( ) 委托调用构造函数 ;

1.1K10

构造,为你揭密对象构造全程(文末同样有福利)

本文部分参考自《极客时间-JavaScript核心原理解析-第13讲》 如有侵权,请联系删除 构造,是JavaScript中面向对象系统核心概念之一。...跟“props”相比,如果props是静态结构,那么“构造”就是动态逻辑。 如果JavaScript没有了构造,那么它就只是一个填满了许多数据静态对象空间。...因为JavaScript1.0时代,也就是最早最早JavaScript其实是没有继承。 那么为什么没有继承JavaScript⼀开始就能声称⾃⼰是“⾯向对象”、“类似Java”⼀⻔语⾔呢?...JavaScript 1.0连继承都没有,为什么⼜能称为⾯向对象语⾔呢? JavaScript确实已经可以将函数作为构造,并且在函数中向实例对象(一般就是this)抄写声明属性。...所以JavaScript1.0开始就有,在这个(也就是构造)中采用是所谓“抄写”方案,将类似拥有的属性声明都抄到对象上,而这个对象,就是JavaScript中this。

49820

【C++】泛型编程 ⑧ ( 模板继承语法 | 普通 继承 模板语法 | 模板 继承 模板语法 | 继承模板必须指定具体类型参数列表 | 继承 模板 必须重写构造函数 )

一、普通 继承 模板语法 1、普通 继承 模板语法 模板 作为父 , 子类 继承 模板 父 , 需要 指定 具体类型参数列表 ; 需要 重写 构造函数 , 其中必须调用 模板 具体... 子类 : // 模板 继承时 , 需要具体化 模板 // 也就是 指定 模板 类型参数列表 , 将 泛型类型 固定下来 // C++ 编译 只有知道了具体类型 , 才能知道 父占用内存大小..., 调用 模板 具体 构造函数 , 如果 子类 继承 模板父 , 如果 子类没有实现 构造函数 , // 模板 继承时 , 需要具体化 模板 // 也就是 指定 模板 类型参数列表...> { public: // 模板 子类 必须重写构造函数 // 在 子类 构造函数中 , 调用 模板 具体 构造函数 // 否则会报错 Son(int a =...> { public: // 模板 子类 必须重写构造函数 // 在 子类 构造函数中 , 调用 模板 具体 构造函数 // 否则会报错 Son(int a =

42830

【C++】异常处理 ⑧ ( 标准异常 | 标准异常继承结构 | 常用标准异常 | 自定义异常继承 std::exception )

一、抛出 / 捕获 多个类型异常对象 1、标准异常 在 C++ 语言中 , 提供了一系列 " 标准异常 " , 这些 " 标准异常 " 都继承了 std::exception , 在 标准库...中 , 抛出异常 , 都是 标准异常 , 都是 std::exception 子类 ; 2、标准异常继承结构 标准异常 定义在 std 命名空间 , 标准异常 std::exception..._What : "Unknown exception"; } } 标准异常继承关系如下图所示 : 上图中 runtime_error 和 logic_error 两个重要异常类型... 1、自定义异常继承 std::exception 首先 , 导入 头文件 ; #include 然后 , 自定义继承 std::exception... , 通过构造函数设置异常信息 , 重写 what 函数 , 在该函数中返回异常信息 ; // 自定义实现标准异常 class eSize : public exception { public

35010

Android 通过 JNI 调用 Java 构造方法和父方法

Android 还可以通过 JNI 来调用 Java 一个构造方法,从而创建一个 Java 调用构造方法 调用构造方法步骤和之前调用实例方法步骤类似,也需要获得对应和方法 id。...完成了以上准备条件后,就可以通过 NewObject 来调用构造方法,从而创建具体。...,就先构造好了字符数组并赋值,得到对应和方法 id 之后,直接通过 NewObject 方法调用即可。...再来看一个调用自定义构造方法示例,还是之前 Animal ,它构造方法有一个 String 类型参数。...首先,构造一个相应子类,然后获得父 类型和方法 id,以及准备对应参数,根据父方法返回值选择调用不同 CallNonvirtualMethod 函数。

2.6K20

C++中中同时存在继承以及组合时候,构造函数构造顺序

C++一大特点就是面向对象,面向对象主要就是一些相关特性(封装、继承、多态)。 那么在继承以及成员属性包含其他实例对象时候,构造函数构造顺序到底是怎么样子呢?...相信大家都知道,实例化对象首先需要调用自身构造函数进行分配内存空间之后进行实例化对象,这就是构造函数整个过程(两步)。...那么当一个对象既包含了继承关系同时也在自身成员属性中包含了其他对象实例化时候,那么这时候实例化该类对象时候,构造函数顺序会是怎么样子呢?下面来看看这一段代码吧。...private: int i_b; }; class C :public A{ // C继承A(C:派生、子类;A:) public: C() { cout...A 构造函数 B 构造函数 C 构造函数 构造顺序是首先构造继承,其次构造组合中实例对象,最后才是构造自己本身。

1.1K20

浅谈数字IC验证中面向对象编程(抽象继承

如何设计大型程序呢?OOP建议使用“divide and conquer(分而治之)”。 程序是一组相关对象进行交互。...面向对象编程使我们可以在软件设计上做同样事情。可以定义一个通用,并使用继承创建该抽象特定实例。...class()定义了对象抽象特征(属性,attributes)和行为(方法,methods)。这是一个用于创建一个或多个相同类型对象蓝图(blueprint)。...例如有一个汽车定义了所有汽车对象可以包含东西,然后在该类基础上定义具有某种特殊属性(品牌、颜色和引擎等)特殊汽车,例如银色保时捷跑车。 使用继承可以允许具有足够相似接口对象共享代码。...父仅用于实现重用和抽象,声明为virtual class,永远不要实例化父。 对象保存运行时数据并用作构建程序,程序实例化对象并触发对象之间互动。

94810

Java如何默认继承Object

那么今天我们就来看看像Java这种依赖于虚拟机编程语言是怎样实现默认继承Object,以及Java编译和JVM到底是如何?...从上面的代码可以看出,new MyClass()打点之后可以选择调用方法有很多,我们定义MyClass里面只有一个main方法,那这些方法哪来,显然是Object里声明,故MyClass就是...因此,Object是超,是所有。 推测可能原因 要了解Java如何默认继承Object原因其实并不需要知道JVM实现细节。只需了解一下对于这种虚拟机程序基本原理即可。...对于这种情况,编译后二进制角度来看,所有的都会有一个父(后面可以以此依据来验证)。...只需要随便找一个反编译工具,将.class文件进行反编译即可得知编译如何编译

1.7K30

Java基础入门之Object、匿名内部类、构造方法继承解析

这篇文章我们主要介绍Java基础中Object、匿名内部类、构造方法继承知识,一起来学习下吧! 一、Object 1.Object是所有,所有继承Object。...三、构造方法继承 1.构造方法继承特点: ① 子类是可以无条件地继承无参数构造方法; ② 如果子类自己没有构造方法,将继承无参数构造方法成为自己构造方法;如果子类自己定义了构造方法...,当在创建新对象时,它将先执行继承无参数构造方法,然后再执行自己构造方法。...③ 对于父含参数构造方法,子类在自己构造方法中用“super”关键字来调用它,在这个调用语句需要是子类构造方法第一个可执行语句。...四、总结 本文主要介绍了Object、匿名内部类、构造方法继承。 Object是所有,所有继承Object

54610
领券