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

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

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

8410

从零开始学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继承一个创建实例时,却不同通过编译。

    96100

    Python中如何使用继承

    想象成创建对象蓝图,以及定义与创建对象相关属性(属性)和行为(方法)。就像一个模板,您可以在代码中使用和重复使用。...继承需要两种类型(又名父):这是将继承其属性和方法。派生(又名子类):这是继承属性和方法。 有五种类型继承: 单继承: 派生单个继承。...多继承: 派生多个继承。 多级继承: 一个一个派生,而该类又从另一个派生。 层次继承: 多个单个派生。 混合继承: 两种或多种继承类型组合。...那是。我们创建一个派生,它继承(Person)属性和方法。这是简单部分。我们将创建一个名为 Staff ,它继承自 Person。...使用 super() 函数 还有 super() 函数,它强制派生继承所有属性和方法。这次,我们将重点关注学生及其毕业年份。

    11010

    十、继承

    继承基本使用 C++中继承是一种面向对象编程特性,它允许我们定义一个(派生或子类)来继承一个或父属性和方法。...如果函数不是函数,派生同名函数将隐藏函数,而不是重写它。...静态成员 静态成员(包括静态变量和静态成员函数)属于本身,而不是某个对象。因此,无论创建了多少个对象,静态成员都只有一份拷贝。...当静态成员被定义在中时,这些成员也会被子类继承,但它们仍然是属于,而不是子类一个独立拷贝。 静态变量:所有派生对象共享中定义静态变量。...构造函数 构造函数是特殊成员函数,用于在对象创建时初始化对象。 构造函数:在创建派生对象时,首先会调用构造函数(如果有的话)。

    7010

    Java基础:继承

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

    57310

    Think in Java之复用

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

    20010

    C# 继承和多态

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

    66210

    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

    EasyC++87,多继承(二)

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

    39210

    面向对象三个基本特征

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

    10.8K30

    60条面向对象设计原则

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

    82160

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

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

    80531

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

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

    11810

    继承

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

    70320

    C++:继承与派生

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

    14710

    【C++篇】虚境探微:多态流动诗篇,解锁动态艺术密码

    它是一个存储虚函数指针数组,每个包含虚函数都至少有一个虚表。当一个函数被调用时,程序并不是直接调用函数地址,而是通过虚函数表间接调用。...1.1.1 虚函数生成过程 继承虚表:当一个派生继承,并且包含虚函数时,派生继承虚表。...当派生重写了函数时,虚表中函数指针会被派生函数指针替换。如果派生定义了函数,这些函数指针将会追加到派生虚表末尾。...由于这种继承路径,派生可能会多个路径继承相同,从而产生两个问题: 数据冗余:每条继承路径都会创建一个独立实例,导致派生中出现多个相同副本。...3.3.2 虚拟继承解决方案 为了解决菱形继承带来数据冗余和函数调用二义性问题,C++ 提供了虚拟继承。通过虚拟继承,派生只会保留一个公共实例,而不是在每条继承路径上都生成一个实例。

    12410

    十一、多态

    在C++中,多态主要通过虚函数来实现,并涉及以下三个关键要素: 继承关系 说明:多态必须发生在具有继承关系之间。即,一个(子类或派生)必须一个(父继承而来。...当通过指针删除派生对象时,如果析构函数不是,那么只会调用析构函数,而不会调用派生析构函数。...由于至少含有一个纯虚函数,抽象不能被实例化(即不能直接创建该类对象)。抽象主要用途是作为一个,为派生提供一个公共接口。...Derived不是抽象,因为它实现了Base继承纯虚函数myFunction()。 使用场景 接口定义:抽象用于定义一组派生必须实现接口。这有助于确保派生遵循特定行为模式。...虚函数表指针工作原理 创建:当一个被编译器处理并且该类包含虚函数时,编译器会为该类创建一个函数表。这个表包含了中所有虚函数地址。

    8110
    领券