首页
学习
活动
专区
工具
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 函数中 , 函数返回对象值 , 创建 要返回 普通对象副本 , 也就是一个

24320

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>了

3K90

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

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

1.7K30

EasyC++87,多继承(二)

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

36510

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

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

33320

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

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

70320

《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对应操作,而这会被拒绝。...这样一个指向派生类类指针析构,如果析构函数不是虚函数,则直接调用析构函数,那么派生类获取资源未释放,则会造成内存泄漏。...而析构函数是虚函数则先调用对应派生类析构函数,再调用类析构函数,资源全部释放。...对于派生类构造函数而言,进入其中类部分已构造完而派生类部分未构造完,对象类型是类,故而此时调用函数,实际上使用函数。 析构函数同理。...进入析构函数后派生类部分呈未定义值,对象类型是类,调用函数。 总而言之,在构造函数与析构函数中虚函数行为有特殊变化;为了避免出错,不要在其过程中使用虚函数

13430

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

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

2.3K40

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

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

94320

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

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

1.3K20

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

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

81940

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

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

13010

设计规则

本节内容 规则 描述 CA1000:不要在泛型类型中声明静态成员 调用泛型类型静态成员,必须指定该类型类型参数。 调用不支持推理泛型实例成员,必须指定该成员类型参数。...CA1012:抽象类型不应具有构造函数 抽象类型构造函数只能由派生类型调用。 由于公共构造函数用于创建类型实例,但无法为抽象类型创建实例,因此具有公共构造函数抽象类在设计上是错误。...这些实参也称为位置实参,因为它们将作为位置形参提供给特性构造函数。 对于每一个强制变量,特性还必须提供一个相应只读属性,以便可以在执行时检索该变量值。...捕捉更具体异常,或者在执行 catch 块中最后一条语句重新引发一般异常。 CA1032:实现标准异常构造函数 如果不能提供完整构造函数集,要正确处理异常将变得比较困难。...默认情况下,仅两个引用指向同一对象它们才相等。 CA1047:不要在密封类型中声明受保护成员 类型声明受保护成员,使继承类型可以访问或重写该成员。

2K20

C++中与类有关注意事项(更新中~~~)

D构造函数,它首先开始 ~D(){ cout << "Des D----5" << endl; } }; int main() { D d; } 当然了,首先调用构造函数是不容置疑...,不管它在哪里,记住即可,不过关于对象成员构造函数调用还需注意, 见 L1, L2, L3, 它们构造函数调用次序与它们在此相对次序有关,如类A排在第一行,因此先调用关于它对象,这里还应再注意一点...,不过这根据需要而定,如果你已经设置了无参构造函数了或者你在类内定义了一些set函数),比如调用构造函数后优先调用a0构造函数,但初始化列表中并没有它,故调用默认构造函数,然后调用a4构造函数...针对继承,其构造函数一般调用顺序为构造函数 ---> 成员对象构造函数 ---> 它自身构造函数(这里是指初始化列表后大括号内内容) 类静态成员(static member)必须在类内声明...类里面的任何成员变量在定义是不能初始化,尽管你可以编译过。 类一个对象调用了一次构造函数之后,是不允许再次调用构造函数

69820

C++纯虚函数 virtual =0

怎么样避免一个CShape被实例化,且在编译就被发现? 答案是:使用pure virtual funcion....这完全归功于多态--编译器针对虚函数产生了可以在运行时刻确定被调用函数代码。 1.3 如何“动态联编”      编译器是如何针对虚函数产生可以再运行时刻确定被调用函数代码呢?...例如: class A { public:     virtual ~A()=0;   // 纯虚析构函数 };     一个类打算被用作其它类,它析构函数必须是虚。...3.2 构造函数和析构函数函数调用      一个类函数在它自己构造函数和析构函数中被调用时候,它们就变成普通函数了,不“虚”了。也就是说不能在构造函数和析构函数中让自己“多态”。...同样,在new B时候,A构造函数调用,但是在A构造函数中,被调用是A::foo()而不是B::foo()。

1.5K40
领券