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

小朋友学C++(10):子类构造函数调用父类构造函数

从哲学层面来看,子类会继承父类除private以外的所有成员。 因为构造函数是公有的,所以理所当然地会被子类继承。...分析: 这里构造函数的写法是 Rectangle() : Shape() { 子类构造函数本身的语句; } 这是先调用父类的构造函数,再执行它本身的语句。从运行结果也可以看出这一点。...那么,如果不显示调用父类的构造函数Shape()呢?父类的构造函数就不被调用了吗? 咱们可以用下面的程序来验证。...分析: 从运行结果可以看出,程序1和程序2的运行结果完全一致。也就是说,Shape()即使不显示调用,实际上也会被调用。并且调用顺序优先于子类本身的构造函数。

1.4K60

Java中子类和父类的构造函数?

参考链接: Java中的继承和构造函数 这篇文章总结了关于Java构造的常见​​问题。  1)为什么创建一个子类对象要也需要调用父类的构造函数? ...如果没有,编译器会插入调用父类构造的语句。这就是为什么在创建子类对象时父类中的构造超函数会被调用。  这里没有创建两个对象,只有一个子对象。...这是上边的Super类发生的情况。  子类的构造函数,无论有参构造还是无参构造,将会调用父类中的默认的无参构造函数。...3)子类中的显式调用父类构造函数  下面的代码是正常的:    子类(Sub)构造函数显式地调用父类(Super)中的带参构造参数。如果父类中定义了相对应的构造函数,那将会被正常良好的调用。  ...4)规则 简而言之,规则是:子类的构造函数必须调用父类中的构造函数,无论隐式调用还是显式调用,无论哪种方式,被调用的构造函数必须得先被定义。

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

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

    类继承格式 : 使用 " : " 继承父类 ; 如果该父类有主构造函数 , 那么子类必须至少有一个主构造函数或次构造函数 , 子类的构造函数下面会根据不同情况详细解析 ; //注意这里的父类构造函数需要实际调用...类继承限制 : 子类使用 : 父类 ( 父类构造函数参数列表 ) ① 类继承限制 : 只有被 open 修饰的类 , 才能有子类继承该类 , 普通的类不允许被继承 ; ② 类方法被重写限制 : 只有被...子类有主构造函数 : 父类必须在主构造函数中初始化 , 子类的 constructor() 可以省略 ; " : " 后的 Father() 相当于调用了父类的主构造函数 , 将子类的主构造函数委托给父类的主构造函数执行...父类构造函数与子类构造函数总结 ---- 子类构造函数最终委托 : 子类的构造函数归根到底都要委托给父类的主构造函数 ; ① 子类主构造函数 : 假如子类有主构造函数 , 该主构造函数肯定要委托父类的主构造函数执行...; ② 子类次构造函数 : 此时子类的次构造函数都要委托子类的主构造函数执行 , 相当于间接委托父类主构造函数执行 ;

    1.3K10

    C++ 类构造函数&解析函数

    Contents 1 一,类的构造函数 1.1 1,构造函数作用 1.2 2,默认构造函数 1.3 3,构造函数特点 1.4 4,带参数的构造函数 1.5 5,使用初始化列表来初始化字段 2 二,类的析构函数...2.1 1,析构函数特点 3 参考资料 一,类的构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。...当且仅当要生成一个 class 的新的实例 (instance)的时候,也就是当且仅当声明一个新的对象,或给该 class 的一个对象分配内存的时候,这个构造函数将自动被调用。...2,默认构造函数 当用户没有显式的去定义构造函数时, 编译器会为类生成一个默认的构造函数, 称为 “默认构造函数”, 默认构造函数不能完成对象数据成员的初始化, 只能给对象创建一标识符, 并为对象中的数据成员开辟一定的内存空间...当用户没有显式定义析构函数时, 编译器同样会为对象生成一个默认的析构函数, 但默认生成的析构函数只能释放类的普通数据成员所占用的空间, 无法释放通过 new 或 malloc 进行申请的空间, 因此有时我们需要自己显式的定义析构函数对这些申请的空间进行释放

    1.5K20

    c++类的构造函数不显式声明会自动生成吗

    说明一下,我用的是g++7.1.0编译器,标准库源代码也是这个版本的。 本篇文章讲解c++11中,类的构造函数种类,以及不显式声明的情况下是否会自动生成。 1....类的构造函数类别 在我刚接触c++的时候,我一直知道类可以有四种形式的构造函数,即无参构造函数、有参构造函数、拷贝构造函数、赋值运算符构造函数,最近看标准IO源代码,发现又多了一种,那就是移动构造函数,...这是c++11中补充进来的,所以现在c++可以拥有四种形式的构造函数,即无参构造函数、有参构造函数、拷贝构造函数、赋值构造函数、移动构造函数、移动赋值构造函数。...,二是类CPtr是存在拷贝构造和移动构造的,接着我们现在把p6那一行注释掉,再编译,就通过了,也就是说对于class类型,当没有显式声明任何构造函数的时候,编译器除了默认生成无参构造函数以外,还会自动生成拷贝构造函数...、赋值构造函数、移动构造函数、移动赋值构造函数,并且自动生成的构造函数都是public的,因为它们是可以用于生成对象的,而对于有参构造函数,因为参数是未知的,所以编译器没有办法自动生成。

    1.2K20

    C++类的构造函数与析构函数

    C++中每个类都有其构造与析构函数,它们负责对象的创建和对象的清理和回收,即使我们不写这两个,编译器也会默认为我们提供这些构造函数。...下面仍然是通过反汇编的方式来说明C++中构造和析构函数是如何工作的。...编译器是否真的会默认提供构造与析构函数 在一般讲解C++的书籍中都会提及到当我们不为类提供任何构造与析构函数时编译器会默认提供这样六种成员函数:不带参构造,拷贝构造,“=”的重载函数,析构函数,以及带const...,当父类存在构造函数时,编译器会默认为子类添加构造函数,子类的构造函数主要是调用父类的构造函数。...何时会调用构造函数 当对一个类进行实例化,也就是创建一个类的对象时,会调用其构造函数。

    1.6K10

    怎么用super调用超类构造函数?

    这些重复的代码在它的超类中已经存在,这样做效率很低,而且,这意味着子类必须被同意具有访问这些成员的权力。然而,有时你希望创建一个超类,该超类可以保持它自己实现的细节(也就是说,它保持私有的数据成员)。...任何时候一个子类需要引用它直接的超类,它可以用关键字super来实现。super有两种通用形式。第一种调用超类的构造函数。第二种用来访问被子类的成员隐藏的超类成员。...使用super调用超类构造函数 子类可以调用超类中定义的构造函数方法,用super的下面形式:java复制代码super(parameter-list); 这里,parameter-list定义了超类中构造函数所用到的所有参数...既然构造函数可以被重载,可以用超类定义的任何形式调用super( ),执行的构造函数将是与所传参数相匹配的那一个。...当然,Box只知道它自己成员的信息。让我们复习super( )中的关键概念。当一个子类调用super( ),它调用它的直接超类的构造函数。这样,super( )总是引用调用类直接的超类。

    14210

    子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?

    (1)子类A继承父类B, A a = new A(); 则: 父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数 (2)若子类构造函数中显式的调用了父类的某构造函数...,则调用该构造函数 class C { C() { System.out.print("C"); } } class A { C c = new C();...,那么就要调用构造方法来初始化该子类对象,但是该类继承自A,所以要先调用父类的构造方法,这里通过super(“B”)显示的调用了父类的带参构造。...执行父类的带参构造前要先对父类中的对象进行初始化,对父类中的c成员进行初始化,调用了C类的无参构造,所以调用顺序为: 先调用C类的无参构造 再调用A类的带参构造 最后调用调用子类的构造 (3...顺序为:父类的静态变量, 父类的静态代码块 ,子类的静态变量,子类的静态代码块。

    2.2K30

    C++ Trick:小心,子类隐藏父类成员函数

    本文讲的是一个C++语言的小Trick,您或许了解也或许不了解,各位看官请细听分说。...按常理来说,如果父类的成员函数是public的,那么子类应该也能直接调用父类定义的函数,所谓的“继承”也便是这个含义。...父类有个成员函数set_birth,接收一个string类型,设置生日。比如"1990/10/10"。子类可以直接调用set_birth。 “这有什么值得一说的?”...果然,子类已经无法调用父类的public成员函数了。明明刚才还可以,怎么set_birth(string)对子类突然不可见了呢? 奥秘在于,子类重载了父类的同名函数。...此时父类的函数确实对子类是不可见的…… 这其实不是一个复杂的知识点,只是容易让人稍不留意就遗忘。 解决方案是什么呢?其实也不难,想办法让父类的同名函数对子类可见!

    1.8K10

    构造函数调用子类的方法,写过吗?

    为什么Base的构造函数与虚构函数即使调用虚函数,也是调自己的函数呢?这跟构造函数与虚构函数的调用顺序有关。子类对象构造的时候,先调父类构造函数初始化父类,再调子类构造函数初始化子类。...子类对象虚构的时候,恰恰相反,先调子类对象的虚构函数,再调父类的虚构函数。输出的结果也证明了这点。 所以如果父类的构造函数与虚构函数是调用子类的函数,那就非常危险了。...因为父类的构造函数执行时,子类的构造函数还没有执行,说明子类还没有初始化,而这时就调用子类的方法,很容易出错,甚至崩溃。...父类的虚构函数执行的时候,子类的虚构函数已经执行完毕,说明子类的资源已经被释放,而这时继续执行子类的方法,也很容易崩溃。于是,C++规范为此作了此约束。...如果真的很想在构造函数内调用子类方法进行初始化,还是显示提供一个初始化函数,让子类对象实例化完后,显示调用初始化函数。

    1.4K20

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

    static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象的时候父类会调用子类方法...但是:创建B对象父类会调用父类的方法? 答案: 当子类被加载到内存方法区后,会继续加载父类到内存中。...如果,子类重写了父类的方法,子类的方法引用会指向子类的方法,否则子类的方法引用会指向父类的方法引用。 如果子类重载了父类方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。 当子类对象创建时,会先行调用父类的构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译的时候,父类构造方法调用的方法的参数已经强制转换为符合父类方法的参数了。 上边代码在编译前已经转换为下面这个样子的了。

    6.2K10

    【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)

    (不是void,不需要写) 对象实例化时编译器自动调用对应的构造函数。 构造函数可以重载。 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明。...因为类中有构造函数,所以编译器不会再生成。又因为它只是带参数的,并不是全缺省或者无参的,所以不是默认构造函数,因此发生错误。...注意:析构 函数不能重载 对象生命周期结束时,C++编译系统系统自动调用析构函数 编译器生成的默认析构函数,对自定类型成员调用它的析构函数,对内置类型不做处理。...类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请 时,则拷贝构造函数是一定要写的,否则就是浅拷贝。 C++规定自定义的类型都会调用拷贝构造。...因为Time类中已经有拷贝构造函数了,而拷贝构造也是构造函数,所以编译器不会再生成默认默认构造函数,这时就需要我们自己写出构造函数。注释的第二行是强制编译器生成默认构造函数。

    17510

    C++构造函数的作用_c++什么是构造函数

    在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。...在C++语言中,“构造函数”就是一类特殊的成员函数,其名字和类的名字一样,并且不写返回值类型(void 也不写)。 构造函数可以被重载,即一个类可以有多个构造函数。...构造函数执行时,对象的内存空间已经分配好了,构造函数的作用是初始化这片空间。 为类编写构造函数是好的习惯,能够保证对象生成时总是有合理的值。例如,一个“雇员”对象的年龄不会是负的。...可是 Complex 类已经有了一个构造函数,编译器就不会自动生成默认构造函数,于是 Complex 类就不存在默认构造函数,所以上述两条语句就无法完成对象的初始化,导致编译时报错。...比如上面的 Student 类,默认生成的构造函数如下: Student(){} 一个类必须有构造函数,要么用户自己定义,要么编译器自动生成。

    1.5K20

    C++新旅程:类的构造函数和析构函数

    并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数(也就是说我们不写,编译器也会自动生成和调用)2....特征如下(1)函数名与类名相同(2)没有返回值(3)对象实例化时自动调用(4)可重载(详细了解可阅读文章缺省参数和函数重载)(5)初始化对象,不开空间(6) 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数...,一旦 用户显式定义编译器将不再生成(不传参数的构造函数为默认构造函数),默认构造函数只能有一个。...注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为 是默认构造函数。...若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载 (4)对象生命周期结束时,C++编译系统系统自动调用析构函数。

    5610

    C++的构造函数

    这就引出了构造函数。 构造函数 C++提供了构造函数来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。...注意: 构造函数的名字必须与类名同名,而不能由用户任意命名,以便编译系统能识别它并把它作为构造函数处理。 它不具有任何类型,不返回任何值。...如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。...Point,你发现这个成员函数连函数类型都没有声明,而且函数名和类名一样,嗯,对,这就是构造函数,而且是没有参数的默认构造函数。...我们在类外定义这个默认构造函数: Point::Point() { x=0; y=0; } 这样,我们在定义新一个类对象的时候,系统就会自动调用这个函数给x和y赋初值。 下面我们来看带参数的。

    16930

    JAVA private私有类的 默认构造函数 的生成过程

    如果一个类没有定义任何构造函数,则编译器将生成一个缺省的构造函数,该构造函数的访问修改符和类的访问修改符相同,例如: class test将生成test()构造函数 public class test将生成...public test()构造函数。...如果读者仔细思考一下创建一个新的类实例的过程,大概已经明白了产生上述现象的原因: 当程序试图创建一个Wrapper$InnerClass的类实例时,却不能使用其缺省的构造函数,因为Wrapper$InnerClass...因此编译器不得不再生成一个可访问的构造函数,由于这里只有Wrapper类的private void testInnerClass()方法使用了new InnerClass(),所以编译器只(需)为这个新的构造函数生成了...同时,为了和已有的缺省构造函数有所区别,就加入了一个Wrapper$1类型的参数,为此,编译器还要生成一个Wrapper$1类。

    1.9K30

    C++ 类构造函数初始化列表

    上面的构造函数(使用初始化列表的构造函数)显式的初始化类的成员;而没使用初始化列表的构造函数是对类的成员赋值,并没有进行显式的初始化。...初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。对非内置类型成员变量,为了避免两次构造,推荐使用类构造函数初始化列表。但有的时候必须用带有初始化列表的构造函数: ?...1.成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。 2.const 成员或引用类型的成员。...因为类类型的数据成员对象在进入函数体前已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,调用构造函数,在进入函数体之后,进行的是对已经构造好的类对象的赋值,又调用个拷贝赋值操作符才能完成(如果并未提供...初始化列表的成员初始化顺序: C++ 初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。 ?

    2K20
    领券