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

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

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

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

    【C++】匿名对象 ③ ( 函数返回值为对象值 匿名对象 拷贝构造函数 与 析构函数 调用情况分析 )

    , 以及不同使用场景下 , 匿名对象 创建与销毁情况 ; C++ 编译器 发现 使用 匿名对象 , 会根据 匿名对象 用法 , 决定对 匿名对象 处理 ; 匿名对象单独使用 : 如果只是单纯使用...Student fun() { Student s1(18, 170); return s1; } 二、函数返回值为对象情况分析 ---- 1、函数返回对象值返回值为匿名对象 如果一个 函数返回值...逐条分析 构造函数 / 拷贝构造函数 / 析构函数 调用过程 : 调用带参数构造函数 m_age = 12 这是在 fun 函数中 , 调用 有参构造函数 , 创建 普通对象 ; 调用拷贝构造函数 这是在...fun 函数中 , 函数返回对象值 , 创建 要返回 普通对象副本 , 也就是一个 匿名对象 ; 调用析构函数 : m_age = 12 这是 fun 函数执行完毕 , 在函数作用域中 普通对象...m_age = 12 这是在 fun 函数中 , 调用 有参构造函数 , 创建 普通对象 ; 调用拷贝构造函数 这是在 fun 函数中 , 函数返回对象值 , 创建 要返回 普通对象副本 , 也就是一个

    29520

    23.C++- 继承多种方式、显示调用父类构造函数、父子之间同名函数、virtual虚函数  上章链接: 22.C++- 继承与组合,protected访问级别

    注意: protected继承只针对子类有效 比如父类是protected继承,则子类子类就无法访问父类所有成员 一般而言,C++项目只用到public继承 显示调用父类构造函数 当我们创建子类对象...,编译器会默认调用父类无参构造函数 若有子类对象,也会默认调用子类对象无参构造函数。...StrB(int i):123 也可以通过子类构造函数初始化列表来显示调用 接下来,修改上面子类StrB(string s)函数,通过初始化列表调用StrA(string s)父类构造函数 改为:...cout<<"Parent.mval="<<c.Parent::mval<<endl; 打印: Child.mval=105 Parent.mval=1010 从打印结果看到,父类和子类<em>之间</em><em>的</em>作用域是<em>不同</em><em>的</em>...所以C++引入了虚<em>函数</em>概念,根据指针指向<em>的</em>对象类型,来执行<em>不同</em>类<em>的</em>同名覆盖成员<em>函数</em>,实现<em>不同</em><em>的</em>形态 定义: 在父类成员<em>函数</em><em>的</em>返回值前面,通过virtual关键字声明,这样便能访问子类中<em>的</em>同名成员<em>函数</em>了

    3.2K90

    C++一分钟之-继承与多态概念

    常见问题与易错点访问权限:派生类可能无法访问类中私有成员,导致误解。记住,只有公有和保护成员才能被继承。构造函数与析构函数构造函数和析构函数不会自动被调用,需要显式调用或使用初始化列表。...菱形问题:多重继承可能出现同一类被多次继承情况,导致资源重复。使用虚继承可以解决此问题。如何避免明确成员访问权限,尽量使用保护成员来传递数据。...在派生类构造函数中,使用初始化列表显式调用构造函数。多重继承考虑菱形问题,适时使用virtual关键字。...常见问题与易错点忘记使用virtual关键字:如果类中函数没有声明为虚函数,派生类即使重写了该函数,也无法实现动态绑定。切片问题:将派生类对象赋值给类对象,派生类特有的部分会被“切片”掉。...空指针调用函数:对空指针调用函数会导致运行时错误。如何避免确保需要被重写函数声明为虚函数。使用引用或指针处理类和派生类关系,避免切片问题。在调用函数前检查指针是否为空。

    11010

    【《Effective C#》提炼总结】提高Unity中C#代码质量21条准则

    ● as和is操作符都不会执行任何用户自定义转换,它们运行时类型符合目标类型才能转换成功,也不会在转换创建新对象。...原则10 使用构造函数链             (减少重复初始化逻辑) ● 编写构造函数很多时候是个重复劳动,如果你发现多个构造函数包含相同逻辑,可以将这个逻辑提取到一个通用构造函数中。...这样既可以避免代码重复,也可以利用构造函数初始化器来生成更高效目标代码。 ● C#编译器将把构造函数初始化器看做是一种特殊语法,并移除掉重复变量初始化器以及重复构造函数调用。...这样使得最终对象可以执行最少代码来保证初始化正确性。 ● 构造函数初始化器允许一个构造函数调用另一个构造函数。而C# 4.0添加了对默认参数支持,这个功能也可以用来减少构造函数重复代码。...你可以将某个类所有构造函数统一成一个,并为所有的可选参数指定默认值。其他几个构造函数调用某个构造函数,并提供不同参数即可。

    1.7K30

    【深入浅出C#】章节 4: 面向对象编程基础:构造函数和析构函数

    1.3 默认构造函数和自定义构造函数区别 默认构造函数和自定义构造函数之间区别如下: 定义方式:默认构造函数是由编译器自动生成无参构造函数类没有显式定义构造函数,默认构造函数会被隐式创建。...创建一个派生类对象构造函数调用顺序从类开始,逐级向下,直到最终创建派生类对象。 初始化列表是用于在构造函数中对字段进行初始化特殊语法。...创建 DerivedClass 对象,首先调用类 BaseClass 构造函数,然后再调用派生类 DerivedClass 构造函数。...创建 MyClass 对象构造函数调用。在 Main() 方法结束,MyClass 对象超出作用域,被垃圾回收器回收,析构函数会被自动调用。...避免执行耗时操作:构造函数应该尽量避免执行耗时操作,以确保对象创建过程不会过于繁琐和耗费资源。 使用构造函数链:在类多个构造函数中使用构造函数链,避免重复代码逻辑,提高代码复用性。

    51420

    EasyC++87,多继承(二)

    虽然这里使用也是virtual关键字,但虚函数和虚之间并没有任何关联,只不过是C++官方不愿意引入更多关键字以免造成使用者负担而已。...使用了虚类之后,一些语法会和之前有所不同,接下来我们来详细介绍。 构造函数 对于非虚继承关系来说,我们可以在构造函数当中将数据传递给类。...B构造函数,B构造函数调用了A,这样一层层传递下去非常方便。...为了避免这种冲突,C++在类是虚,禁止数据通过中间类传递给虚类,因此上述代码中wk参数将会失效。在这种情况下,编译器会调用Worker默认构造函数。...如果不希望通过默认构造函数来创建对象,也可以手动显示地调用构造函数: SingingWaiter(const Worker &wk, int p=0, int v=0): Worker(wk),

    38710

    学过 C++ 你,不得不知这 10 条细节!

    析构函数 析构函数 可以发现在进入 operator== 函数,发生了「复制构造函」,离开该函数作用域后发生了「析构函数」。... const 和 non-const 成员函数有着实质等价实现时,令 non-const 版本调用 const 版本可避免代码重复。...这个构造函数和上一个构造函数最终结果是一样,但是效率较高,凸显在: 上一个构造函数(赋值版本)首先会先自动调用 m_Name 和 m_Score 对象默认构造函数作为初值,然后在构造函数体内立刻再对它们进行赋值操作...---- 消除 copying 函数之间重复代码 还要一点需要注意:不要令复制「构造函数调用「赋值操作符函数」,来减少代码重复。这么做也是存在危险,假设调用赋值操作符函数不是你期望。...同样也不要令「赋值操作符函数调用构造函数」。 如果你发现你「复制构造函数和赋值操作符函数」有近似的代码,消除重复代码做法是:建立一个新成员函数给两者调用

    74320

    【C++进阶学习】第三弹——菱形继承和虚拟继承——菱形继承二义性和数据冗余问题

    菱形继承很容易带来冗余性和二义性,这些就需要我们用虚拟继承来解决,这些问题挺重要,我们往下看 二、菱形继承 C++中菱形继承是指在类继承关系中,存在两个或更多个直接或间接类,它们之间形成了一个类似菱形结构...这种继承结构通常出现在多层继承中,一个派生类同时从两个不同类继承到了同一个,就可能导致问题。 问题1:冗余性 冗余性主要体现在代码重复。...虚类:在虚继承中,被继承类被称为虚类。 虚成员变量和成员函数在子类中只会存在一份,避免了冗余性问题。...(这个知识点还是比较重要,因为一些原因,我这里并不会讲,感兴趣可以自己去网上搜一下视频,或者与我私聊) 3、构造函数和析构函数虚继承构造函数和析构函数会按照继承顺序依次调用,从而确保虚构造和析构正确地执行...6、多继承虚继承:多个类同时virtually继承同一个虚,虚成员变量和成员函数在子类中只会存在一份,避免了冗余性和二义性问题。

    14320

    《Effective C++》学习笔记

    由于函数有重载特性,const和non-const成员函数有实质等价实现时,用non-const版本调用const版本来避免代码重复,但不要反过来调用,这不符合逻辑。...条款12:复制对象勿忘其每一个成分 复制构造函数和赋值构造函数要确保复制了对象内所有成员变量和所有类成分,这意味着你如果自定义以上构造函数,那么每增加成员变量,都要同步修改以上构造函数,且要调用相应构造函数...实现 条款26:尽可能延后变量定义式出现时间 尽可能延后变量定义式出现,既包括延后构造它,保证只有真正使用才构造;也包括只有到赋值构造它,避免默认构造函数无畏调用。...衍生类需要访问 protected 成员,或需要重新定义继承而来函数,可以这么设计。 此外,private继承可以让空空间最优化。...创建对象,会先进行new,然后调用构造函数,如果构造出现异常,就需要delete,否则内存泄漏。

    1.1K20

    硬核 | C++ 基础大全

    一般构造函数: 也称重载构造函数,一般构造函数可以有各种参数形式,一个类可以有多个一般构造函数,前提是参数个数或者类型不同,创建对象根据传入参数不同调用不同构造函数。...作为参数不同,传指针实质是传值,传递值是指针地址;传引用实质是传地址,传递是变量地址。 野(wild)指针与悬空(dangling)指针有什么区别?如何避免?...如果有多个类,则构造函数调用顺序是某类在类派生表中出现顺序,而不是它们在成员初始化表中顺序。 成员类对象构造函数。...当初始化一个引用成员变量; 初始化一个 const 成员变量调用一个构造函数,而构造函数拥有一组参数调用一个成员类构造函数,而他拥有一组参数; 编译器会一一操作初始化列表,以适当顺序在构造函数之内安插初始化操作...,则它们会以声明顺序被调用; 如果任何虚类拥有析构函数 构造函数执行算法?

    1.2K10

    《Effective C++》读书笔记(2):构造析构赋值运算

    可以让它们继承上面的类,即可禁止编译器生成拷贝操作:编译器试图为它们生成拷贝构造/拷贝运算符时会尝试调用类Uncopyable对应操作,而这会被拒绝。...这样一个指向派生类类指针析构,如果析构函数不是虚函数,则直接调用析构函数,那么派生类获取资源未释放,则会造成内存泄漏。...而析构函数是虚函数则先调用对应派生类析构函数,再调用类析构函数,资源全部释放。...对于派生类构造函数而言,进入其中类部分已构造完而派生类部分未构造完,对象类型是类,故而此时调用函数,实际上使用函数。 析构函数同理。...进入析构函数后派生类部分呈未定义值,对象类型是类,调用函数。 总而言之,在构造函数与析构函数中虚函数行为有特殊变化;为了避免出错,不要在其过程中使用虚函数

    14930

    《逆袭进大厂》第二弹之C++进阶篇59问59答(超硬核干货)

    1) 必须使用成员初始化四种情况 ① 当初始化一个引用成员; ② 当初始化一个常量成员; ③ 调用一个构造函数,而它拥有一组参数; ④ 调用一个成员类构造函数...通过将对象存储到“对象池”中实现对象重复利用,这样可以避免多次创建重复对象开销,节约系统资源。 零拷贝 零拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储技术。...假设类中采用是非虚析构函数删除类指针指向派生类对象就不会触发动态绑定,因而只会调用析构函数,而不会调用派生类析构函数。...假设类中采用是非虚析构函数删除类指针指向派生类对象就不会触发动态绑定,因而只会调用析构函数,而不会调用派生类析构函数。...,从实验结果来看,语句1并没有体现,执行流程是先构造类,所以先调用构造函数构造完成再执行A自己构造函数,析构也是调用析构函数,也就是说构造和析构中调用函数并不能达到目的,应该避免

    2.3K40

    【笔记】《C++Primer》—— 第18章:用于大型程序工具

    18.1 异常处理 在之前5.6时候简单提到过异常处理,当时只大概介绍了如何使用C++异常处理部分,这一节更深入地介绍了异常处理细节 异常处理流程是:在C++中我们throw了一个表达式后会...catch过程称为栈展开,查找到主函数还没有停止时会调用terminate终止程序,而如果找到了则在catch处理完异常后从这个最后catch之后地方继续程序运行 由于栈展开可能会提前退出一些块...要注意是构造函数开始执行后异常,如果是参数初始化过程中发生异常则需要调用者自己在上下文中处理 异常发生抛出异常对象是一种特殊对象,可以是类对象也可以是函数或数组指针。...要注意构造顺序是与派生列表中出现顺序一致,与派生类参数顺序无关 C11中允许派生类从多个类中继承构造函数,但是如果多个构造函数都相同的话将产生错误,此时派生类应该自己定义一个构造函数来覆盖它们...析构函数调用顺序与构造顺序相反特性仍在 合成拷贝移动等操作规则也与之前一致 我们可以用类指针指向派生类对象,但是调用对应函数时候编译器不会觉得不同方向转换有好坏之分,因此有多个接受不同类参数但名字相同函数

    99120

    《C++Primer》第十八章 用于大型程序工具

    一个类具有多个,有可能出现派生类从两个或者多个类中继承了同名成员情况。此时不加前缀限定符直接使用该名字将引发二义性。...构造函数与虚继承 在虚派生中,虚类是由最低层派生类初始化。以我们程序为例,创建Panda对象,由Panda构造函数独自控制ZooAnimal初始化过程。...假如在我们继承体系中,创建一个Bear或者Raccoon对象,它就已经位于派生最底层,因为Bear或Raccoon构造函数将直接初始化器ZooAnimal类部分: Bear::Bear(std...如果ZooAnimal没有默认构造函数,那么代码将发生错误。 虚类总是先于非虚构造,与它们在继承体系中次序和位置无关。...5.2 构造函数与析构函数次序 一个类可以有很多虚类,这些虚子对象按照它们在派生列表中出现顺序从左往右依次构造

    1.4K20

    C++相关基础知识总结笔记

    移动构造函数接受一个同类型对象右值引用作为参数。构造函数调用顺序一个类继承自另一个类构造函数会在派生类构造函数之前被调用。...如果派生类构造函数没有显式调用构造函数,那么编译器会自动调用默认构造函数(如果有的话)。...派生类和类:一个类继承自另一个类,派生类析构函数会在析构函数之前被调用。如果派生类析构函数没有显式调用析构函数,则默认调用析构函数。...对象作为函数返回值:函数返回一个对象,默认情况下会调用拷贝构造函数来创建一个临时对象。对象初始化另一个对象:使用一个对象初始化另一个对象,会调用拷贝构造函数。...它被调用情况包括:一个新对象通过已存在对象初始化时;一个函数参数通过引用传递,并且该函数调用时;一个函数返回对象通过值返回一个对象用于初始化另一个对象

    10220

    译 | 你到底有多精通 C# ?

    重载方法中 null 值 在转到其他话题之前,让我们仔细了解在调用参数数量相同但类型不同重载方法如何处理空值。...通常,一个参数类型可以转换成一个参数类型 (即一个参数类型从另一个参数类型派生) ,代码可以编译。将调用具有更具体参数类型方法。 这两种类型之间不可以转换,代码将不会编译。...类初始化 最佳实践建议尽可能避免构造函数类初始化,以防止异常。 所有这些对于静态构造函数来说都更加重要。 您可能知道,当我们尝试在运行时实例化静态构造函数,它在实例构造函数之前调用。...,上面的代码应该捕获静态构造函数引发异常,更改配置以避免在以后调用中引发异常,最后成功地创建类实例,对吗?...调用它们它们在中定义构造函数可能尚未调用,因此它们可能会出现意外行为。 多态性 多态性是不同类以不同方式实现相同接口能力。

    83640

    C# .NET面试系列二:面向对象

    主要特点和用途包括:初始化对象:构造函数主要用于初始化类实例。使用 new 关键字创建类对象构造函数会被调用,确保对象在使用之前处于一个合适状态。...然而,派生类可以调用构造函数,并可以在派生类构造函数中通过 base 关键字调用构造函数,实现对构造函数间接调用。...多个引用指向同一个对象它们共享对该对象访问权限,对对象修改将反映在所有引用上。...属性和特性在C#中分别服务于不同目的,但它们都有助于提高代码可读性、可维护性和可扩展性。20. 使用 new B() 创建 B 实例,产生什么输出?...b ,首先调用类 A 构造函数

    19910
    领券