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

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

一、不能自动继承的成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数。...声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化调用基类构造函数完成(如果没有给出则默认调用默认构造函数)。...初始化列表参数多个且其中有调用基类构造函数时,先执行基类构造函数(从最远的开始,如果多重继承则按继承的顺序);其他对象成员若不止一个,则按定义的顺序构造,与初始化列表顺序无关。...关于初始化列表可以参考这里 析构的顺序与构造的顺序相反。...派生类对象自动转换为基类对象(特有的成员消失) 当派生类以private/protected方式继承基类时 派生类对象指针(引用)转化为基类对象指针(引用)需用强制类型转化。

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

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

    的 子类 : // 类模板 继承时 , 需要具体化 类模板 // 也就是 指定 类模板 的 类型参数列表 , 将 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小..., 类模板子类 与 普通类子类 区别就是 , 类模板子类 需要在尖括号中指定 具体的 类型参数列表 的 数据类型 ; 此时 , 在继承时 , 被继承的 类模板 必须 声明 类型参数列表 , 将具体的泛型类型写在尖括号中..., 调用 类模板 具体类 的构造函数 , 如果 子类 继承 类模板父类 , 如果 子类没有实现 构造函数 , // 类模板 继承时 , 需要具体化 类模板 // 也就是 指定 类模板 的 类型参数列表...二、类模板 继承 类模板语法 1、类模板 继承 类模板语法 普通类 继承 类模板时 , 需要指定 类模板 的具体 参数类型 , 下面代码中的 具体类型就是 int ; class Son : public...中的 泛型 T , 与 Father 中的 T 没有任何关系 , 也就是说 Son2 中的 泛型类型 T 相当于 普通类 继承 类模板 中的 具体类型 int , Father 类中的 泛型 T 已经被覆盖掉了

    1.1K31

    【Flutter】Dart 面向对象 ( 类定义 | 类的继承 | 私有变量 | 可选参数 | 默认参数 | 初始化列表 )

    文章目录 一、 Dart 面向对象 二、 类定义 三、 类的继承 四、 私有变量 五、 可选参数与默认参数 六、 初始化列表 七、 完整代码示例 八、 相关资源 一、 Dart 面向对象 ---- OOP...基本特点 : 封装 : 将现实中存在的事务封装成类 ; 继承 : 使用现有类的功能 , 无需重写现有类的变量及方法 , 只实现扩展内容 ; 多态 : 子类对象可以赋值给父类类型变量 ; 类中定义的内容...String toString() { return "$name : $age"; } 代码示例 : // 定义 Dart 类 // 与 Java 语言类似, 所有的类默认继承 Object...// 如果父类有非空参数的构造函数, 子类必须实现相同参数的构造函数 // 如果该类有父类 , 那么先调用父类的构造方法 , 完成父类的初始化 // 然后才能完成自己的初始化 // this.school...// 与 Java 语言类似, 所有的类默认继承 Object 类 class Person{ // 定义变量 String name; int age; // 标准构造方法, 下面的方法是常用的构造方法写法

    2K00

    iOS数据持久化之二——归档与设计可存储化的数据模型基类

    iOS数据持久化之二——归档与设计可存储化的数据模型基类 一、引言         在上一篇博客中,我们介绍了用plist文件进行数据持久化的方法。...三、设计可以归档存取的数据模型基类 1、动机与初衷         通过上面对归档的介绍,我们可以发现归档一个十分有潜力的应用:可以自由存取自定义的数据对象。...所以我们会想,能否设计一个这样的model基类,来使需要存储的model都继承于它,使我们的model不需要实现NSCoding方法的同时可以支持归档呢,通过runtime和OC语言特性的一些小技巧,我们是可以做到的...2、基类模型的设计         我们新建一个BaseModel类,核心方法如下: //归档与解归档的方法 - (instancetype)initWithCoder:(NSCoder *)coder...runtime机制,我们可以很方便的是新建的model继承于这个基类,无需其他处理直接支持归档,修改与优化都不受影响。

    1.1K30

    【深度学习实验】网络优化与正则化(四):参数初始化及其Pytorch实现——基于固定方差的初始化(高斯、均匀分布),基于方差缩放的初始化(Xavier、He),正交初始化

    一、实验介绍   深度神经网络在机器学习中应用时面临两类主要问题:优化问题和泛化问题。 优化问题:深度神经网络的优化具有挑战性。 神经网络的损失函数通常是非凸函数,因此找到全局最优解往往困难。...基于固定方差的参数初始化 a. 高斯分布初始化   它假设参数的分布服从高斯分布(也称为正态分布),其中均值为0,方差为^2。通过从这个分布中随机采样,可以得到参数的初始值。...基于方差缩放的参数初始化   基于方差缩放的参数初始化方法旨在根据神经网络的结构和激活函数的特性来选择合适的方差,以更好地初始化参数。...与Xavier初始化类似,He初始化也从均值为0的高斯分布中随机采样,但是使用方差^2 = 2/n进行缩放,其中n是输入的数量。...He初始化通过适当增加方差来解决ReLU激活函数的梯度消失问题,从而更好地初始化参数。

    25310

    【C++】继承 ⑥ ( 继承中的构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

    一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ 的 " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父类 : 需要 基类 ( 父类 ) 对象的..." 公有继承 " 的 派生类 ( 子类 ) 本质上 具有 基类 ( 父类 ) 的 完整功能 , 使用 基类 可以解决的问题 , 使用 公有继承派生类 都能解决 ; 特别注意 : " 保护继承 " 和..." 私有继承 " 的 派生类 , 是 不具有 基类 的 完整功能的 , 因为 最终继承 后的派生类 , 无法在 类外部调用 父类的 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...子类对象 , 父类指针 值为 子类对象 在 堆内存 的地址 , 也就是 将 子类对象 地址 赋值给 父类类型指针 ; 引用 : 父类引用 引用 子类对象 , 将 子类对象 赋值给 父类类型的引用 ; 二...(p_parent); // 接收父类引用参数 fun_reference(*p_parent); // I.

    30720

    C# new

    在C#中,new关键字有三种主要用法: new 运算符 (New Operator): 用于创建对象和调用构造函数。这是new关键字最常见的用法,用于实例化类和调用构造函数。...new 修饰符 (New Modifier): 作为修饰符时,new关键字用于在派生类中隐藏从基类继承的成员,这样新的实现将会隐藏基类中的同名方法或属性。...new 约束 (New Constraint): 用于在泛型声明中,指定泛型类型参数必须具有公共的无参数构造函数。这种用法确保了在泛型类型参数被实例化时,会调用该类型的默认构造函数。...这些步骤确保了在创建对象时,对象的内存空间被正确分配,构造函数被调用以初始化对象,然后返回一个可以操作的对象引用。 new关键字在派生类中隐藏从基类继承的成员,这个隐藏怎么理解?...new关键字被用来显式隐藏从基类继承的成员。当派生类中的成员(方法、属性等)与基类中的成员同名时,通过使用new关键字,派生类可以隐藏基类的同名成员,即使它们的签名相同。

    16020

    【笔记】《C++Primer》—— 第三部分:类设计者的工具

    每次继承一个基类就会在内存中生成一个子对象,存放了基类的成员,也正是因为这个原因派生类可以转换为基类 派生类的构造函数需要负责所有成员的初始化,尽管派生类也可以初始化继承来的基类成员,但是这不符合通常的编码思路...如果表达式不是引用也不是指针,则其动态类型永远与静态类型一致 派生类可以往基类类型转换,而基类不能隐式反向转换 一个派生类的函数如果想要覆盖继承来的虚函数,那必须名称和形参都一致,否则编译器会认为这两个函数是独立的...final,表示不允许继续覆盖 有时候希望某个基类只用来被继承而不允许实例化,这时候我们可以给这个基类加入纯虚函数,拥有纯虚函数的基类叫抽象基类,不能被直接创建。...类模板不会推断参数的类型 类模板的成员函数只有在使用时才会实例化 类模板与另一个模板直接最常见的友元是一对一的友元,首先模板需要声明所有需要用到的名字,然后在声明友元时标注出目标类的具体模板实参 类模板也可以一对多友元...,另一种用法是对包中的每个元素都自动调用一个指定的函数,并返回处理后的返回值 模板特例化的写法是将template尖括号中的需要特例化的内容删去,然后对下方用到的模板类型转为需要确定的类型。

    1.7K10

    从零开始学C++之继承(一):公有私有保护继承、overloadoverwriteoverride之间的区别

    新类称为派生类或子类,原有类称为基类或父类 派生类是基类的具体化 (一)、派生类的声明语法为: class 派生类名 : 继承方式  基类名 {            派生类新增成员的声明;...(四)、接口继承与实现继承 我们将类的公有成员函数称为接口。 公有继承,基类的公有成员函数在派生类中仍然是公有的,换句话说是基类的接口成为了派生类的接口,因而将它称为接口继承。...对基类的数据成员的重定义 对基类成员函数的重定义分为两种 overwrite(隐藏) override(覆盖) (六)、继承与组合 无论是继承与组合本质上都是把子对象放在新类型中,两者都是使用构造函数的初始化列表去构造这些子对象...(has-a) 如果希望新类与已存在的类有相同的接口(在这基础上可以增加自己的成员)。这时候需要用继承,也称为子类型化。...隐藏(overwrite)(派生类与基类) (1)不同的范围(分别位于派生类与基类); (2)函数名与参数都相同,基类无virtual关键字 (3)函数名相同,参数不同,virtual可有可无 当隐藏发生时

    1.1K00

    复习C++&笔记

    类与对象 1、静态成员函数没有this指针,静态成员变量可以通过classname::或object.调用,声明非常量静态成员时,需要在类中加static前缀但不能定义或初始化,在类外定义和初始化但不能再加...虚函数与虚继承 7、类的虚继承指继承的方式,虚基类是相对于继承的类来说的(而不是基类的属性)。...虚基类解决了多继承中父类存在多个共同基类实例的问题(非虚继承的情况下,如B、C继承A,D继承B、C,则D型对象继承了B-A和C-A两个不同的基类),从而共享A的数据成员。...8、当继承关系满足:基类A-基类B(虚继承基类A)-派生类C。派生类的构造函数的执行顺序:基类A、基类B、对象成员、派生类。...通常在多继承中会出现多个基类B虚继承基类A,基类A的构造函数首先被调用,基类B不调用A类的构造函数。

    42930

    C++中冒号(:)和双冒号(::)的用法总结

    ,可以有参数列表,这里省去~myClass();// 析构函数int a;const int b;}myClass::myClass():a(1),b(1)// 初始化列表{}注 1:初始化列表的作用相当于在构造函数内进行相应成员变量的赋值...我们知道,const 类型的变量必须在定义时进行初始化,而不能对 const 型的变量进行赋值,因此 const 类型的成员变量只能(而且必须)在初始化列表中进行初始化,即下面的代码将会出错:myClass...::myClass(){a = 1;// 没错,效果相当于在初始化列表中进行初始化b = 1;// 出错,const变量不能进行赋值操作;}注 2:初始化的顺序与成员变量声名的顺序相同。...注 3:对于继承的类来说,在初始化列表中也可以进行基类的初始化,初始化的顺序是先基类初始化,然后再根据该类自己的变量的声明顺序进行初始化。...class 派生类名 :继承方式 基类名{派生类的成员};// 继承方式:public、private和protected,默认处理是public。

    2.6K20

    QT(C++)面试总结

    继承与派生的区别 1、角度不同 继承是从子类的角度讲的,派生是从基类的角度讲的。 2、定义不同 派生指江河的源头产生出支流。引申为从一个主要事物的发展中分化出来。...基类名1,继承方式2 基类名2,… { 成员声明; } 注意:每一个“继承方式”,只用于限制对紧随其后之基类的继承。...3)公有派生类对象可以被当作基类的对象使用,反之则不可。 派生类的对象可以隐含转换为基类对象; 派生类的对象可以初始化基类的引用; 派生类的指针可以隐含转换为基类的指针。...通过基类对象名、指针只能使用从基类继承的成员,派生类新增的成员就不能使用了 Qt4与Qt5的三个区别 1.新增widgets模块 在Qt4中,Qt提供的全部图形界面相关类都包含在Qt Gui模块中...它主要有如下几种用法: ①用于类层次结构中基类和子类之间指针或引用的转换。

    2.1K10

    【C++进阶学习】第四弹——多态——迈向C++更深处的关键一步

    前言: 在前面我们已经学习了C++中继承的相关知识,已经体会到C++在与C语言的对比中的便捷性,但是有一些问题并没有被解决,比如继承中如何使不同的派生类公用基类的一个函数,这就需要多态的知识,而且...虚函数是实现动态多态的关键,因为它允许在运行时根据对象的实际类型来调用相应的函数。 2、通过基类指针或引用调用虚函数: 多态通常通过基类的指针或引用来实现。...当使用基类指针或引用指向派生类对象时,调用虚函数将根据对象的实际类型(而不是指针或引用的类型)来决定调用哪个函数。...3、派生类必须重写(override)基类的虚函数: 派生类需要重写基类中的虚函数,以提供特定于派生类的实现。重写时,函数签名(包括返回类型、函数名和参数列表)必须与基类中的虚函数完全匹配。...抽象类只有在将其中的纯虚函数重写之后才能实例化对象。抽象类主要用于定义接口,实际的业务逻辑通常由继承它的具体子类来实现。

    12910

    C#基础知识之base、this、new、override、abstract梳理

    一、Base关键词的几种用法 base重要用于OOP的多态上,base 关键字用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限在构造函数、实例方法和实例属性访问器中 1、base调用基类构造函数...new 关键字可以显式隐藏从基类继承的成员。...{ new public string Name { get; set; } = "dachong"; } 3、new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型 new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数...由 override 声明重写的方法称为重写基方法。重写的基方法必须与 override 方法具有相同的签名。不能重写非虚方法或静态方法。...,且只能作为基类,也不能被实例化。

    45920

    Kotlin中级(6)- - - Kotlin类之的继承.md

    Kotlin继承类 1.超类(Any) 在Kotlin中,所有的类都是继承自Any类,这是一个没有父类型的类。...但是它们并不是同一个类 从源码中所产生的疑惑:类与函数前面都加了open这个修饰符,既然Any是所有类的父类,那么我们自己要定义一个继承类,跟着Any类的语法与结构就能定义一个继承类,所以open修饰符是我们定义继承类的修饰符...2.2继承类的构造函数 无主构造函数 当实现类无主构造函数时,则每个辅助构造函数必须使用super关键字初始化基类型,或者委托给另一个构造函数。...存在主构造函数 当存在主构造函数时,主构造函数一般实现基类型中参数最多的构造函数,参数少的构造函数则用this关键字引用即可 class MyView(context: Context?...: this(context,attrs,0) } 2.3函数的重载与重写 在Kotlin中关于函数的重载与重写和Java中几乎是一样的,但是这里还是举例说明一下 重写函数中的量点特殊用法 不管是

    60960

    面试官问我多态,我是这么回答的

    01、函数重载 普通函数重载 函数重载是指在同一个作用域内,名称相同但是参数列表(参数的类型、数量、顺序)不同的一组函数。编译器会根据函数调用时提供的参数类型和数量,自动选择匹配的函数版本进行调用。...当一个基类指针或引用指向一个派生类对象时,便可以通过这个基类指针调用派生类中重写的函数,实现在运行时的多态。由此可知,动态多态需要有三要素: 1. 继承:要有基类和子类,甚至是多个子类 2....虚函数:基类内应有虚函数,子类最好要重写(override)虚函数 3. 指针或引用:指向子类对象的基类指针或引用 动态多态可以简单的认为是继承+虚函数实现。...而虚函数表由编译器生成,每个含有虚函数的类均有一个虚函数表,同时一个类的虚函数表只有一个,与类的实例化对象数量并无关联。...含有纯虚函数的类为虚基类,虚基类不能用于声明对象 禁止重写虚方法 从父类继承的虚方法默认为虚函数,当不希望该虚方法被子类重写时,可以使用final关键字注明,禁止该虚方法被重写。

    6510

    C++基础——C++面向对象之重载与多态基础总结(函数重载、运算符重载、多态的使用)

    ,以及继承的特征,本次博文总结下C++面向对象的另外两个关键特征——重载与多态。...当调用一个重载函数或重载运算符时,编译器通过把所使用的参数类型与定义中的参数类型对比,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。...编译程序,运行结果如下:         以上简单的实例,我们知道了函数重载的用法,有时需要避免用户传入的参数类型不在重载函数里,编译器报错这种情况,这时可以多写几个重载函数,设置多个参数类型。...; 3)存在基类类型的指针或者引用,通过该指针或引用调用虚函数。...然后通过基类的指针来访问 Dog 类对象与 People 类的对象的 speak()方法,前提是基类的 speak()方法必须声明为虚函数,且基类和派生类中定义的方法名要相同,否则,基类的指针将访问到基类自己的

    86410

    C++学习知识点

    C++中,实现多态有以下方法:虚函数,抽象类,重载,覆盖,模板。 2.类的特征 答:封装、继承和多态。 3. C++与C#的区别 (1)C++中类的申明时,不能给数据成员赋值,通常使用构造函数来完成。...(2)C++支持多重继承,即子类可以有多个父类,而C#不支持多重继承,可用接口来实现,但C++中没有接口类型。 (3)C++中类的申明方式不分公有和私有,继承的时候分公有,私有和保护的方式继承。...当基类以函数参数的形式存在,调用虚函数时,在编译的时候不能静态的映射到虚函数的代码,因为此时不知道是调用基类的虚函数还是子类的虚函数,这是就需要发生动态联编。...为什么基类类型指针在被子类对象赋值后不能访问子类的成员函数呢?...对于类定义对象什么时候用new,什么时候不用new的认识 (1) 构造函数只适用于类成员的初始化,与分配类对象的空间无关; (2) 隐式执行默认构造函数,初始化申明在栈上的类对象,直接申明,不要使用

    1.7K20
    领券