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

派生中虚函数和非虚函数继承效果

而虚函数作用,主要是为了让父指针可以调用子类函数,这种是在运行时才决定调用哪个函数 1、虚函数:   C++函数主要作用是“运行时多态”,父中提供虚函数实现,为子类提供默认函数实现。...子类可以重写父函数实现子类特殊化。 2、纯虚函数:   C++中包含纯虚函数,被称为是“抽象”。抽象不能使用new出对象,只有实现了这个纯虚函数子类才能new出对象。   ...C++中纯虚函数更像是“只提供申明,没有实现”,是对子类约束,是“接口继承”。   C++中纯虚函数也是一种“运行时多态”。...3、普通函数:   普通函数是静态编译,没有运行时多态,只会根据指针或引用“字面值”对象,调用自己普通函数。   普通函数是父为子类提供“强制实现”。   ...因此,在继承关系中,子类不应该重写父普通函数,因为函数调用至于对象字面值有关。 参考链接

7010

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

一、不能自动继承成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 构造函数不被继承,派生中需要声明自己构造函数。...声明构造函数时,只需要对本类中新增成员进行初始化,对继承成员初始化调用构造函数完成(如果没有给出则默认调用默认构造函数)。...输出可以看出: 派生对象构造次序: 先调用对象成员构造函数,接着是构造函数,然后是派生对象成员构造函数,最后是派生自身构造函数。...初始化列表参数多个且其中有调用构造函数时,先执行构造函数最远开始,如果多重继承则按继承顺序);其他对象成员若不止一个,则按定义顺序构造,与初始化列表顺序无关。...向下转型不安全,没有自动转换机制 // 语法上来演示对象可以转化为派生对象,但是没有意义 1、转换构造函数: Manager(const Employee& other) : Employee

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

Java继承重名static函数浅谈解析调用与分派

今天被实习生问了这么个问题: 在java中,static成员函数是否可以被重写呢? 结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常非static函数那样运行。...也就是说,虽然你可以定义一个重写函数,但是该函数没有多态特性。...,当我们用父实例引用(实际上该实例是一个子类)调用static函数时,调用是父static函数。...原因在于方法被加载顺序。 当一个方法被调用时,JVM首先检查其是不是方法。如果是,则直接调用该方法引用变量所属中找到该方法并执行,而不再确定它是否被重写(覆盖)。...动态分派是用于方法重写,比如我调用一个A方法f,如果该类有子类a,那么我以a来调用f时候,调用实际是a.f而非A.f。 看起来还真的像动态分派是不是?但是结果不符合啊!

1.2K30

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

一、继承 C++很重要一个特征就是代码重用。在C语言中重用代码方式就是拷贝代码、修改代码。C++可以用继承或组合方式来重用。通过组合或继承现有的创建,而不是重新创建它们。...继承是使用已经编写好创建具有原有所有属性和操作,也可以在原有基础上作一些修改和增补。...组合通常是在希望内部具有已存在功能时使用,而不是希望已存在作为它接口。组合通过嵌入一个对象以实现功能,而用户看到是新定义接口,而不是来自老接口。...那么当一个试图它那继承时候,必然会由于试图调用构造函数、析构函数而导致编译错误。 可是这个构造函数和析构函数都是私有函数了,我们怎样才能得到该类实例呢?...但当我们试图FinalClass2继承一个创建实例时,却不同通过编译。

92400

Java基础:继承

创建一个时,总是在继承,因此,除非已明确指出要从其他继承,否则就是在隐式地Java标准根Object进行继承。...构造函数初始化: 运行结果可以看出,根基 static 会首先执行,然后是下一个导出,以此类推。...继承扩展 在上面提到过:当创建一个导出一个对象时,这个子对象和你直接用创建对象是一样。二者区别在于,后者来至于外部,而子对象被包装在导出对象内部。...实际上只是调用父实例构造器,不是在子类对象上 new 一个对象。 Java 程序视角来看,对象创建才刚刚开始 —— 方法还没有执行,所有的字段都还为零。...继承涉及到和导出这两个,而不是只有一个,但从外部看来,它就像是一个具有相同接口,或许还会有额外方法和域。但继承并不只是复制接口。

55510

Think in Java之复用

有一点需要注意:编译器并不是会为所有的引用都创建默认对象,引用会初始化几个位置: 在定义对象地方。...会在构造函数之前被调用初始化 构造器中也会保证会被初始化 当在使用对象时候在进行初始化,也被叫做惰性初始化,在不必立马用到或者不必要生成对象时候用这种方式 当使用实例时候 继承 导出外部来看就像是一个具有相同接口...但继承并不只是复制接口。当创建一个导出实例时,该实例包含了一个子对象。这个子对象与你直接创建是一样。...编译器会默认生成一个构造器,在这个构造器中会默认调用构造器 代理 继承和组合中庸之道 将一个成员对象置于所要构造中,在构造中暴露该成员对象所有方法。...如何选择 继承是现有一种类型,"is a",是一个 组合:“has a”有一个 一个最清晰判断就是是否需要对进行向上转型为

19110

C# 继承和多态

创建一个时,程序员不需要完全重新编写数据成员和成员函数,只需要设计一个继承了已有的成员即可。这个已有的被称为,这个被称为派生。...和派生 一个可以派生自多个或接口,这意味着它可以多个或接口继承数据和函数。...C# 中创建派生语法如下: class { ... } class : { ... } 初始化 派生继承成员变量和成员方法。...多重继承指的是一个类别可以同时多于一个继承行为与特征功能。...分别为: 函数重载 运算符重载 动态多态性 C# 允许您使用关键字 abstract 创建抽象,用于提供接口部分类实现。当一个派生继承自该抽象时,实现即完成。

64210

EasyC++87,多继承(二)

我们创建SingingWaiter这个当中包含了两个Worker对象,但实际上我们只需要一个就行了。因为一个SingingWaiter也应该只有一份Worker数据,没有必要有两份。...想要从根源上解决问题,需要使用C++官方提供一个功能——虚。 虚可以使得多个派生出对象只继承一个对象,要使用虚,需要在声明当中使用关键字virtual。....}; 这么设置了之后,继承Singer和Waiter对象共享了一个Worker对象,而不是各自引入自己Worker对象副本。...使用了虚之后,一些语法会和之前有所不同,接下来我们来详细介绍。 构造函数 对于非虚继承关系来说,我们可以在构造函数当中将数据传递给。...如果不希望通过默认构造函数创建对象,也可以手动显示地调用构造函数: SingingWaiter(const Worker &wk, int p=0, int v=0): Worker(wk),

36710

C++:29 --- C++继承关系下内存布局(下)

观察前面的G、H和I, 我们可以得到如下关于VC++虚继承下内存布局结论: 1 首先排列非虚继承实例; 2 有虚时,为每个增加一个隐藏vbptr,除非已经非虚继承那里继承一个vbptr...4 多重继承函数 如果多个有虚函数继承一个实例就有可能包含多个vfptr。考虑如下R和S: ?...所以,当覆盖非最左边函数时,MSC++一般不创建调整块,也不增加额外函数项。...7 虚继承函数 T虚继承P,覆盖P虚成员函数,声明了函数。如果采用在函数表末尾添加方式,则访问虚函数总要求访问虚。...在VC++中,为了避免获取虚函数表时,转换到虚P高昂代价,T中函数通过一个函数表 获取 ,从而带来了一个函数表指针。该指针放在T实例顶端。 ?

1.2K20

面向对象三个基本特征

继承是指这样一种能力:它可以使用现有所有功能,并在无需重新编写原来情况下对这些功能进行扩展。 通过继承创建称为“子类”或“派生”。 被继承称为“”、“父”或“超”。...继承过程,就是从一般到特殊过程。 要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。 在某些 OOP 语言中,一个子类可以继承多个。...但是一般情况下,一个子类只能有一个,要实现多重继承,可以通过多级继承来实现。 继承概念实现方式有三:实现继承、接口继承和可视继承。...但是 Leg 却不能继承 Person ,因为腿并不是一个人。 抽象仅定义将由子类创建一般属性和方法,创建抽象时,请使用关键字 Interface 而不是 Class。...例如,教师是人,Teacher 是Person“一种”(a kind of )。那么Teacher可以Person派生(继承)。 如果A是,B是A派生,那么B将继承A数据和函数

10.8K30

Java编程思想第五版第八章 -复用

初始化 现在涉及到两个:和派生。想象派生生成结果对象可能会让人感到困惑。外部看,具有相同接口,可能还有一些额外方法和字段。但是继承并不只是复制接口。...当你创建派生对象时,它包含子对象。这个子对象与你自己创建对象是一样。只是外部看,子对象被包装在派生对象中。...即使不为 Cartoon 创建构造函数,编译器也会为你合成一个无参数构造函数,调用构造函数。尝试删除 Cartoon 构造函数来查看这个。...注意到, Orc toString() 方法也使用了版本。 向上转型 继承最重要方面不是提供方法。它是一种关系。...当构造器完成后,实例变量按文本顺序初始化。最终,构造器剩余部分被执行。 本章小结 继承和组合都是已有类型创建类型。组合将已有类型作为类型底层实现一部分,继承复用是接口。

77031

60条面向对象设计原则

(5)不要把实现细节(例如放置共用代码私有函数)放到公有接口中。   如果类两个方法有一段公共代码,那么就可以创建一个防止这些公共代码私有函数。   ...(46)如果两个或更多个共享公共接口(指的是消息,而不是方法),那么只有他们需要被多态地使用时,他们才应当从一个公共继承。   (47)对对象类型显示分情况分析一般是错误。...(51)如果你觉得需要在运行时刻创建,那么退后一步以认清你要创建是对象。现在,把这些对象概括成一个。   ...(54)在创建继承层次时,试着创建可复用框架,而不是可复用组件。   (55)如果你在设计中使用了多重继承,先假设你犯了错误。如果没犯错误,你需要设法证明。   ...(56)只要在面向对象设计中用到了继承,问自己两个问题:(1)派生是否是它继承那个东西一个特殊类型?(2)不是派生一部分?

78860

【c++】继承学习(二):探索 C++ 中派生默认机制与静态成员共享

应该使用构造函数来初始化 确保构造函数被调用是继承中非常重要一部分,因为只有构造函数知道如何正确初始化定义成员。..._stuNum << endl; } 这里会编译错误: 将某些函数声明为友元,这个友元关系不会自动传递给派生)。...Person 和 Student 两个友元,可以访问两个保护成员 3.继承与静态成员 定义了static静态成员,则整个继承体系里面只有一个这样成员。...每当创建一个 Person 实例或者它派生实例时,构造函数都会递增 _count,因此 Student 和 Graduate 示例也会递增 _count。...因此,第二次打印 _count 结果是 0 静态成员继承性质:静态成员在及其派生之间是共享,而不是每个派生都有独立静态成员副本。

10110

继承

继承 面向对象编程主要目的之一就是提供可以重复使用代码,减少开发周期,提高开发效率。 继承可以完成一些工作: 在已有基础上添加功能。 给添加数据成员。 可以修改方法行为。...多态公有继承 在实际开发过程中,我们有时候希望同一个方法在派生行为是不同,也就是说,方法行为取决于调用该方法对象,即同一个方法行为随上下文而异,我们将这种复杂行为称为多态(具有多种形态...在派生对象中将包含一个自己函数表,如果派生没有重新定义虚函数,则派生函数列表保函数原始版本地址;如果派生提供了虚函数新定义,则该虚函数列表对应位置将保存函数地址;如果派生新增加虚函数...总之,重新定义继承方法不是重载,而是隐藏同名方法。...抽象函数声明结尾处为=0,该虚函数称为纯虚函数。当声明中包含纯虚函数时,则不能创建该类对象。 在虚函数原型中使用=0指出一个抽象,在中可以不定义该函数

68620

C++:继承与派生

一、继承概念和定义 1.1 继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用最重要手段,它允许程序员在保持原有特性基础上进行扩展,增加功能,这样产生,称派生...2、如何实现一个不能被继承 ? 将构造函数藏在私有作用域里,这样继承时候子类不可见构造函数,就无法创建出子类对象了!...(将析构函数设成私有也可以) 但是你可能会想,把构造函数放在私域,那A不是创建不了对象了吗???确实是这样! 但是也有一个解决方法,就是利用静态成员函数去返回这个构造函数。...因为这涉及到先有鸡还是先有蛋问题,我们不创建对象就调用不了这个函数,但是要调用这个函数又需要一个对象,所以为了解决这个问题,只能将该函数变成静态成员函数,这样我们可以通过限定符去访问他 七、复杂菱形继承及菱形虚拟继承...这是为了后面的虚函数表做准备,用来存表找到虚函数偏移量(菱形继承多态)。在多态那一环节会去验证。 八、继承总结和反思 1. 很多人说C++语法复杂,其实多继承就是一个体现。

10710

61条面向对象设计经验原则

p16   (5)不要把实现细节(例如放置共用代码私有函数)放到公有接口中。p17   如果类两个方法有一段公共代码,那么就可以创建一个防止这些公共代码私有函数。   ...p89   (46)如果两个或更多个共享公共接口(指的是消息,而不是方法),那么只有他们需要被多态地使用时,他们才应当从一个公共继承。...p97   (50)不要把对象变成派生。对任何只有一个实例派生都要多加小心。p99   (51)如果你觉得需要在运行时刻创建,那么退后一步以认清你要创建是对象。...把可选包含建模成继承会带来泛滥成灾。p108   (54)在创建继承层次时,试着创建可复用框架,而不是可复用组件。p112   (55)如果你在设计中使用了多重继承,先假设你犯了错误。...p120   (56)只要在面向对象设计中用到了继承,问自己两个问题:(1)派生是否是它继承那个东西一个特殊类型?(2)不是派生一部分?

56020

C++中继承

继承概念及定义 继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用最重要手段,它允许程序员在保持原有特性基础上进行扩展,增加功能,这样产生,称派生。...: // B中fun和A中fun不是构成重载,因为不是在同一作用域 // B中fun和A中fun构成隐藏,成员函数满足函数名相同就构成隐藏。...,大小为派生继承成员地址到真正成员地址偏移量大小,被放在最后一次继承派生末尾 继承和组合 1 public继承是一种is-a关系。...也就是说每个派生对象都是一个对象。 2 组合是一种has-a关系。假设B组合了A,每个B对象中都有一个A对象。 3 优先使用对象组合,而不是继承 。...继承一定程度破坏了封装,改变,对派生有很大影响。派生依赖关系很强,耦合度高。 5 对象组合是继承之外另一种复用选择。更复杂功能可以通过组装或组合对象来获得。

8110

Android开发笔记(九十三)装饰模式

基本概念 装饰模式是扩展功能用一种设计模式, 一般要扩展功能,我们都会想到继承,可是继承只能继承一个,如果有多个条件需要分别进行扩展,那得写好几个派生,条件越多派生数量也越多。...装饰模式把成员分为四个角色: 1、抽象:定义该集合将要使用基本属性和方法。 2、初步实现派生:由抽象简单派生而来,并实现普通构造函数。...3、待装饰:定义抽象一个实例,并实现一个基于对象构造函数。 4、装饰好派生:由待装饰派生出来,可进行定制化处理。...虽然它本身不是继承自Context,内部也没有Context实例,但是每当一个广播到达时,框架都传递一个Context对象给onReceive()。...它本身也不是继承自Context,但是它可以通过getContext()函数返回一个Context对象。

37720

继承

继承:它能够已有的派⽣出新,⽽派⽣继承了原有(称为特征,包括⽅法。 可以通过继承完成⼀些⼯作: 可以在已有基础上添加功能。 可以给添加数据成员。 可以修改⽅法⾏为。...可以在继承特性中添加: 派⽣需要⾃⼰构造函数。 构造函数必须给成员(如果有的话)和继承成员提供数据。 派⽣可以根据需要添加额外数据成员和成员函数。...1.2 构造函数:访问权限考虑 派⽣构造函数必须使⽤构造函数私有成员进行初始化。 派生对象创建过程: 创建派⽣对象时,程序⾸先调⽤构造函数创建对象。...公有继承建⽴⼀种is-a关系,即派⽣对象也是⼀个对象,可以对对象执⾏任何操作,也可以对派⽣对象执⾏。 继承原始所有数据成员。...创建派⽣对象时,将调⽤派⽣构造函数,⽽不是构造函数,然后,派⽣构造函数将使⽤⼀个构造函数,这种顺序不同于继承机制。 派⽣继承构造函数

1.3K30

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券