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

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

地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 公有继承 " 的 派生类 ( 子类 ) 本质上 具有 基类 ( 父类 ) 的 完整功能 , 使用 基类 可以解决的问题 , 使用 公有继承派生类 都能解决 ; 特别注意 : " 保护继承 " 和..." 私有继承 " 的 派生类 , 是 不具有 基类 的 完整功能的 , 因为 最终继承 后的派生类 , 无法在 类外部调用 父类的 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...cout 父类 funParent 函数" << endl; } private: int c; }; // 子类 公有继承 父类 class Child : public...函数 赋值兼容性原则示例 : 父类 funParent 函数 父类 funParent 函数 父类 funParent 函数 父类 funParent 函数 Press any key to continue

30920

创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法?

:为什么创建A对象的时候父类会调用子类方法?...但是:创建B对象父类会调用父类的方法? 答案: 当子类被加载到内存方法区后,会继续加载父类到内存中。...如果,子类重写了父类的方法,子类的方法引用会指向子类的方法,否则子类的方法引用会指向父类的方法引用。 如果子类重载了父类方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。 当子类对象创建时,会先行调用父类的构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...但是:由于java语言是静态多分派,动态单分派。其结果是当编译的时候,父类构造方法调用的方法的参数已经强制转换为符合父类方法的参数了。 上边代码在编译前已经转换为下面这个样子的了。

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

    ASP.NET AJAX(6)__Microsoft AJAX Library中的面向对象类型系统命名空间类类——构造函数类——定义方法类——定义属性类——注册类类——抽象类类——继承类——调用父类方

    定义构造函数 定义成员(方法、属性、事件) 注册类 类——构造函数 类的构造函数即为function定义 通常用于初始化域变量 自由成员使用下划线开头(形式上的封装) 类——定义方法 使用prototype..._mymethod=function{throw Error.notImplemented();}}//包含抽象方法 类——继承 调用父类的构造函数 有父类的类必须调用父类的构造函数,否则会丢失继承效果...可以直接以普通方式实现父类的抽象成员 toString方法无法被继承 类——调用父类方法 MyNamespace.MyClass.prototype={myMethod:function(param1...= function(name) { MyNamespace.Intern.initializeBase(this, [name]);//调用父类构造函数 } MyNamespace.Intern.prototype...Employee的三个类 接口 与类的定义方法大致相同 构造函数抛出异常 所有的方法抛出异常(只有方法签名,不提供实现) 注册接口时使用registerInterface方法 接口无法继承其他接口 接口定义

    6.2K50

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

    ---- 使用 extends 关键字定义子类 , 注意如果父类有非空参数的构造函数, 子类必须实现相同参数的构造函数 ; // 继承 class Student extends Person{ Student...String school; String city; String address; // 如果父类有非空参数的构造函数, 子类必须实现相同参数的构造函数 // 如果该类有父类.../ 父类构造方法 : 如果父类没有默认构造方法 (无参构造方法) , // 必须在初始化列表中调用父类构造函数 , super(name, age) ; // 构造方法方法体...; String city; String address; // 如果父类有非空参数的构造函数, 子类必须实现相同参数的构造函数 // 如果该类有父类 , 那么先调用父类的构造方法...// 不同的初始化实例变量之间使用逗号隔开 // 父类构造方法 : 如果父类没有默认构造方法 (无参构造方法) , // 必须在初始化列表中调用父类构造函数

    2K00

    第二十八节:Java基础-进阶继承,抽象类,接口

    ,函数名,参数列表都要一样 子父类中构造函数的特点 在子类和父类中都有构造函数,运行时,先执行父类中的构造函数,在执行子类的构造函数,因为子类的所有构造函数中第一行都有一句,隐式的super();,...在子类中为什么有super()呢,子类会一旦继承父类,会继承父类中的内容,子类在初始化的时候,会先到父类进行父类的初始化操作,这没问题吧,因为这样才可以使用父类中的内容。...子类中所有的构造函数,都会访问父类中默认的空参函数。...在构造函数中,第一行默认都是super(),所有对象的父类都是Object类,所以父类中的构造函数默认第一行,除非自己写,否则都是隐式的super(),用来访问父类中的构造函数。...接口 接口解决了多继承的问题,将多继承的这种机制在java中通过接口实现了,接口与接口之间是继承的关系。

    35630

    关于Java构造函数(Constructor)的常见问题总结1 为什么调用子类的构造方法的时候,默认会调用父类的构造方法2 常见错误:Implicit super constructor is und

    这篇文章总结了Java使用构造函数中最常遇到的五个问题!...这就是为什么我们上面的那个例子程序会先调用super的构造方法。 但要切记,** 虽然调用了父类的构造方法,但只创建了一个对象也就是子对象。...编译器错误是因为默认的super()无参的构造函数是没有定义的。在Java中,如果一个类没有定义构造函数,编译器会自动插入一个默认的无参的构造函数。...解决这个问题很简单,我们可以给父类插入一个无参的构造函数,或者在子类构造函数中显示的调用的父类有参构造函数。 在子类的构造函数中显示的调用父类的构造函数 下面的代码是正确的。 ?...为什么Java在一个类已经实现了一个带参的构造函数的时候,不实现默认的无参构造函数? 这是个很有趣的问题。

    3K41

    java中关于继承的问题

    https://blog.csdn.net/sinat_35512245/article/details/53767724 先来看一道面试题: java中关于继承的描述正确的是() A、一个子类只能继承一个父类...B、子类可以继承父类的构造方法 C、继承具有传递性 D、父类一般具有通用性,子类更具体 正确答案: A C D ---- 子类不可以继承父类的构造方法,只可以调用父类的构造方法。...子类中所有的构造函数都会默认访问父类中的空参数构造函数,这是因为子类的构造函数内第一行都有默认的super()语句。super()表示子类在初始化时调用父类的空参数的构造函数来完成初始化。...一个类都会有默认的空参数的构造函数,若指定了带参构造函数,那么默认的空参数的构造函数,就不存在了。这时如果子类的构造函数有默认的super()语句,那么就会出现错误,因为父类中没有空参数的构造函数。...因此,在子类中默认super()语句,在父类中无对应的构造函数,必须在子类的构造函数中通过this或super(参数)指定要访问的父类中的构造函数。 PS:方法没有继承一说,只有重载和重写

    1.5K00

    【Flutter】Dart 面向对象 ( 命名构造方法 | 工厂构造方法 | 命名工厂构造方法 )

    student):super(student.name, student.age); 父类构造函数 : 如果父类没有默认构造函数, 子类必须调用父类的构造函数 ; 方法体 : 命名构造方法与普通构造函数一样...age"; } } // 继承 class Student extends Person{ // 命名构造方法 // 定义格式 : 类名.方法名() // 父类构造函数 : 如果父类没有默认构造函数...school; String city; String address; // 父类构造函数调用 : 如果父类有非空参数的构造函数, 子类必须实现相同参数的构造函数 // 如果该类有父类..., 那么先调用父类的构造方法 , 完成父类的初始化 // 然后才能完成自己的初始化 // // this.school 指定自有参数 // {this.school} 是可选参数, 可选参数必须在构造函数参数列表中最后一个...// 必须在初始化列表中调用父类构造函数 , super(name, age) ; // // 构造方法方法体 : 可以省略 ; Student(this.

    1K01

    【前端词典】继承

    类与原型 类 讲 ECMAScript 继承的概念之前,我先说下类的概念。(如果接触过 Java 或者是 C++ 的话,我们就知道 Java(C++)的继承都是基于类的继承)。...小结 基于构造函数,没有使用原型链 子对象和父对象公用一个原型对象 三、借用构造函数法 此方法可以解决原型中引用类型值被修改的问题 function staff(){ this.test = [1,2,3...五、原型式继承 - Object.create() 利用一个临时性的构造函数(空对象)作为中介,将某个对象直接赋值给构造函数的原型。...缺点(同原型式继承): 原型中引用类型值会被修改 无法传递参数 七、寄生组合式继承(推荐) 该方法主要是解决组合继承调用两次超类构造函数的问题。...子类必须在 constructor 方法中调用 super 方法,否则新建实例时会报错。这是因为子类没有自己的 this 对象,而是继承父类的 this 对象,然后对其进行加工。

    60470

    Java|继承学习总结

    两者在某一类中只能出现一次,且必须在构造方法中的第一行. 继承中父与子类的构造方法 1.父子构造均无参数 在调用子类实例化时,会自动调用父类的构造方法。...str){ System.out.print1n("父类无参构造函数"); } } 2)需要继承有参构造方法,在子类中直接调用 super(父类构造函数参数列表); (注意事项:必须在子类构造方法中的调用...4.Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类...在父类中该方法不需要有方法体,只需要有个方法名,这种方法就称为抽象方法.Java中提供了专门的修饰符,来修饰抽象方法. ?...理解:调用抽象类的抽象方法,没有具体的方法体,没有意义。 2.抽象类中,可以有构造方法,在子类创建对象时,会自动调用。 理解:子类实例化时原本就会调用父类构造方法,在抽象类中一样适用。

    46930

    写给Java后端的ReactJS快速入门教程-ES6中的class类关键字

    相关源码地址 使用 class 声明创建一个基于原型继承的具有给定名称的新类。...语法 class name [extends] { // class body } 声明一个类 在下面的例子中,我们首先定义一个名为Polygon的类,然后继承它来创建一个名为Square的类。...注意,构造函数中使用的 super() 只能在构造函数中使用,并且必须在使用 this 关键字前调用。...才可以哦,这在 Java 中也是一样的:如果一个子类通过extends 关键字继承了父类,那么,在子类的constructor 构造函数中,必须优先调用一下super()。...super是一个函数,而且它是父类的构造器,子类中的super, 其实就是父类中,constructor 构造器的一个引用。

    33710

    java学习与应用(3.3)--异常、多线程、lambda简

    发生异常时,JVM创建异常对象,没有try catch则发送给方法的调用者main,main方法提交到JVM处理,JVM打印并终止java程序。...Objects工具类的非空静态方法:requireNonNull方法,自动判断值是否为空然后抛出异常。 throws将异常对象抛出(throw)给方法的调用对象。...异常必为Exception或子类,抛出时候有子父类关系只声明父类。返回上级后的函数仍然需要抛出异常声明。...自定义异常,继承Exception(编译期异常)或RuntimeException(运行期异常),然后定义构造方法,和带字符串参数的构造方法,调用父类的对应方法。 并行与并发 ?...改变线程名称:使用setName方法,或者使用带参数构造方法继承父类初始化创建设置。暂停线程Thread的静态方法sleep(单位为毫秒),添加异常处理使用。

    64220

    Dart学习笔记

    变量定义 Dart中,不像其他语言存在基本类型与类类型,Dart中所有类型(包括int等)都是继承自Object的类型 字符串字符为UTF16编码,小数都为double类型,函数类型为Function,...void main(){} 类与构造函数 Dart的类可以被继承(extends),也可以被实现(implements) Dart也提供复杂结构类型的定义语法,通过class关键字 类中成员定义语法为...[static] type variable,被static修饰成员代表静态成员,是共享变量 类除了可以使用默认的同名无返回值函数作为构造函数,还可以定义 类名.xyzxxx格式的无返回值函数作为构造函数.../ 抽象类 Dart中通过extends关键字进行继承,Dart允许通过mixin实现伪多继承 继承构造 子类构造函数默认继承父类构造函数(隐式调用) 通过在子类构造函数形参列表后使用:可以修改要使用的父类构造函数...mixin继承 mixin继承解决多继承同名同类型成员冲突的规则是,如果当前类中,包含该同名同类型成员,则使用当前类成员,否则使用离with关键字最优、实现了该同名同类型成员的类中的成员,比如 class

    1.1K30

    面试官问我:创建线程有几种方式?我笑了

    前言 多线程在面试中基本上已经是必问项了,面试官通常会从简单的问题开始发问,然后再一步一步的挖掘你的知识面。 比如,从线程是什么开始,线程和进程的区别,创建线程有几种方式,线程有几种状态,等等。...然后,再说面试中怎样回答面试官的问题比较合适。 1、继承 Thread 类 通过继承 Thread 类,并重写它的 run 方法,我们就可以创建一个线程。...然后创建 Runnable 实现类对象,并把它作为 target 传入 Thread 的构造函数中 最后调用 start 方法启动线程。 ?...然后,父对象 Thread 中,在构造方法中传入了一个 Runnable 接口的实现类,实现了 run 方法。...若假设子类没有实现 run 方法,那么就会去父类中寻找 run 方法,而父类的 run 方法会判断是否有 Runnable传过来(即判断target是否为空),现在 target 不为空,因此就会执行

    4.4K10

    ECMAScript中类与继承详解(Java对比学习)

    #name) // -> SyntaxError 类中的构造函数 二者同: 如果声明一个一个类的时候没有声明构造函数,那么会默认添加一个空的构造函数,构造函数在new实例化一个对象的时候会被调用 二者异...继承过程中的构造函数: ES6中,子类中,super方法是必须调用的,因为子类本身没有自身的this对象,需要通过super方法拿到父类的this对象。...在子类中,没有构造函数,那么在默认的构造方法内部自动调用super方法,继承父类的全部属性,子类的构造方法中,必须先调用super方法,然后才能调用this关键字声明其它属性。...如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。...即使在创建类后修改类的构造函数上的原型对象仍然不会有任何问题。

    43310

    转向Kotlin——类和接口

    类的声明 和Java没有什么两样,Kotlin中,类的声明也使用class关键字,如果只是声明一个空类,Kotlin和Java没有任何区别,不过定义类的其他成员,区别就很大了。...Kotlin的类中,除了可以声明一个主构造器之外,还可以声明若干个第二构造器,第二构造器必须在类中声明,前面必须加constructor关键字。...类的继承 1、如何继承 与Java不同,Kotlin类的继承需要使用冒号(:),而Java使用extends。注意,冒号后面需要调用父类的构造器。...Kotlin和Java一样,都是单继承的,也就是说,一个Kotlin类只能有一个父类。...:实现接口与继承父类类似,使用冒号(:),但后面不是调用构造方法,而是是指跟接口名;Kotlin中的接口的方法,允许包含默认方法体,对于这样的额方法,子类实现接口时不一定必须实现该方法。

    93330

    Java虚拟机 - 超级详细的类加载说明

    所以我们继续带着问题看源码,查看加载器的父类的话是调用getParent()方法,所以可以在对应的类中找该方法,发现在这几个类中,只有ClassLoader中存在getParent方法。 ?...接下来查看AppClassLoader、ExtClassLoader是如何被创建的。其实就是在Launcher()类的构造函数中。 ?...先看第一个红框,ExtClassLoader的创建 ? 跟到底后发现,调用了ClassLoader中外部传入加载器的构造函数。 ?...AppClassLoader中也调用了ClassLoader中外部传入加载器的构造函数,并且这里的parent变量其实就是前一行刚创建出来的ExtClassLoader。...· 双亲委派 终于来了 面试必问 前面看了这么多加载器被创建出来的过程铺垫,其实就是为了证明类被加载时是需要经过双亲委派的。

    47020

    Java企业面试——Java基础

    重写Override表示子类中的方法可以与父类的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现...抽象类中定义抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。...一个类可以实现多个接口,但只能继承一个抽象类。 1.3 创建线程有几种不通的方式?...l 自定义类继承Thread类方式 l 自定义类实现Runnable接口方式 1.4 Java集合框架的基本接口有哪些?...懒汉模式 public class Single { //私有构造函数 private Single(){} //在本类中创建本类对象 private static Single instance =

    78040

    TypeScript 面向对象程序设计(OOP)

    在 JavaScript 中 ES6 之前我们使用函数(构造器函数)和基于原型来创建一个自定义的类,但这种方式总会让人产生困惑,特别是习惯了 Java、PHP 等面向对象编程的同学来说更加难以理解。...构造函数用于类的初始化,可以声明哪些字段是必传的,哪些字段是非必传的。...子类重载父类的方法 我们不能定义重名的函数,也无法在同一个类中定义重名的方法,但是在派生类中我们可以重写在基类中同名的方法。...注意:如果派生类中写了 constructor() 方法,必须在 this 之前调用 super 方法,它会调用基类的构造函数。...,使用相同的函数名完成不同的功能,通俗的讲:一个子类可以修改、重写父类中定义的相同名称的方法,父类可以使用抽象类或接口来定义相应的规范。

    82931
    领券