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

C++多态#1虚函数

多态函数函数声明很简单,在成员函数声明处用 virtual 关键字标志即可,例如以下片段 class base{ public: virtual void fun(){...<<endl; } }; 这样函数是不恰当,基类中 void fn(int x)和子类中 void fn(float x)显然是两个不同函数,它们仅仅是同名函数重载,虽然 subClass...继承 base,但并没有实现多态 fn(int x)函数,而是新增了一个自己多态 fn(float x)函数,为继承它子类准备......但有例外情况,两个函数参数形式相同,返回类型不同,基类中函数返回基类指针或基类引用,子类中函数则返回子类指针或子类引用,其同样构成多态,这很合理,一个函数可以处理 base 类对象(基类),也可以处理...<<endl; return this; } }; 虚函数几大限制 只有成员函数才能是虚函数,因为虚函数仅适用于有继承关系类对象。

26810

C++多态与虚函数

Contents 1 C++ 多态概念 2 C++ 多态实例 3 C++ 多态总结 4 虚函数 5 多态应用 6 参考资料 本文文学习笔记总结讲得比较浅显,更深入内容可以参考C++ Primer。...C++ 多态概念 多态字面意思是一个事物有多种形态,在 C++ 程序设计中,多态性是指具有不同功能函数可以用同一个函数名,这样就可以用一个函数名调用不同内容函数。...C++ 多态总结 有了虚函数,基类指针指向基类对象时就使用基类成员(包括成员函数和成员变量),指向派生类对象时就使用派生类成员。...C++ 提供多态目的是:可以通过基类指针对所有派生类(包括直接派生和间接派生)成员变量和成员函数进行“全方位”访问,尤其是成员函数,从而实现一个接口,多种方法。...从这个例子中也可以发现,对于具有复杂继承关系大中型程序,多态可以增加其灵活性,让代码更具有表现力。 参考资料 C++多态和虚函数快速入门教程

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

C++多态与虚函数

概念 1.1 多态 不同类对象对相同方法或函数产生有不同反应。多态实现依赖于虚函数 静态多态和动态多态 静态多态(编译时多态) 这是通过方法重载实现一种多态性形式。...虚函数 2.1 作用 虚函数作用主要是实现了多态机制。基类定义虚函数,子类可以重写该函数;在派生类中对积累定义函数进行重写时,需要在派生类中声明该方法为虚方法。...2.3 构造函数可以为虚函数吗 在C++中,构造函数(包括拷贝构造函数和移动构造函数)不能声明为虚函数。...虚表工作原理: 每个包含虚函数C++类都有一个对应函数表。 虚表中存储了该类中函数地址。 每个对象都包含一个指向其类虚表指针。...virtual区别:重写基类函数必须要有virtual修饰,重载函数和被重载函数可以被virtual修饰,也可以没有 2.5 C++多态示例 #include using namespace

12710

C++多态函数动态绑定

定义 动态绑定是将一个过程调用与相应代码链接起来行为。是指与给定过程调用相关联代码,只有在运行期才可知一种绑定,它是多态实现具体形式。...原理 C++中,通过基类引用或指针调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定关键。...用引用(或指针)调用函数在运行时确定,被调用函数是引用(或指针)所指对实际类型所定义C++中动态绑定是通过虚函数实现。而虚函数是通过一张虚函数表实现。...在C++标准规格说明书中说到,编译器必需要保证虚函数指针存在于对象实例中最前面的位置(这是为了保证正确取到虚函数偏移量)。...2.通过基类类型指针访问派生类自己函数将发生错误。 虚函数、动态绑定、运行时多态之间关系: 虚函数是动态绑定基础;动态绑定是实现运行时多态基础。

1.3K20

C++多态 ① ( 类型兼容性原则与函数重写 | “ 多态 “ 引入 | 函数重写 )

一、类型兼容性原则与函数重写 1、" 多态 " 引入 在面向对象中 , " 多态 " 是 设计模式 基础 , 是 软件框架 基础 ; 面向对象 三大特征 是逐步递进 , 封装 -> 继承 ->...多态 ; 封装 : 将 成员变量 和 成员方法 封装到 类中 , 是一切基础 ; 拿到类对象后 , 就可以调用其中 成员变量 和 成员方法 ; 继承 : 类在 封装 基础上 , 可以进行继承操作..., 子类 继承 父类 成员 , 可以复用之前写代码 ; 多态 : 在 继承 基础上 , 才能讨论 多态 概念 ; 多态 与 继承 正好相反 , 继承 是 复用 之前写代码 ; 多态 是 复用...之后写代码 ; 2、函数重写 函数重写 : 同时 在 子类 和 父类 中 , 定义 函数原型 相同 函数 , 就是 " 函数重写 " , 子类 重写 父类 中 函数 ; 父类 中 被子类 重写..., 执行 被子类重写函数 , 调用是 父类 函数 ; 父类 引用 指向 子类对象 , 执行 被子类重写函数 , 调用 仍然是 父类 函数 ; 引用类型是什么类型 , 调用就是什么类型函数

15040

C++ 多态、虚函数、纯虚函数《Rice C++ 学习开发》

这一篇文章来讲讲C++多态、虚函数、纯虚函数C++多态 多态C++多态分为静态多态,动态多态。...静态多态:调用函数被编译器设置为基类中版本,函数调用在程序执行前就决定了好了,这就是所谓静态多态,或静态链接。 动态多态:派生类对象地址可以赋值给基类指针。...对于通过基类指针调用基类和派生类中都有的同名、同参数表函数语句,编译时并不确定要执行是基类还是派生类函数;而当程序运行到该语句时,如果基类指针指向是一个基类对象,则基类函数被调用,如果基类指针指向是一个派生类对象...动态多态: 静态多态变成动态多态,需要稍微修改一下代码,通过虚函数方法来实现动态链接。在函数前添加virtual。虚函数是一种在基类定义为virtual函数,并在一个或多个派生类中再定义函数。...,如果派生类重写了虚函数,则调用子类函数,否则调用基类函数

29920

C++进阶:详解多态多态、虚函数、抽象类以及虚函数原理详解)

C++进阶:详解多态多态、虚函数、抽象类以及虚函数原理详解) 结束了继承介绍:C++进阶:详细讲解继承 那紧接着肯定就是多态啦 1.多态概念 多态是指同一个函数名可以根据调用对象不同而具有不同实现...它分为两种类型:编译时多态(静态多态)和运行时多态(动态多态)。 编译时多态: 通过函数重载和运算符重载实现,是在编译阶段确定函数调用。...运行时多态允许通过基类指针或引用来调用派生类函数,实现了动态绑定。 2.多态定义和实现 2.1多态构成条件 多态实现通常依赖于虚函数。在基类中声明虚函数,然后在派生类中进行重写(覆盖)。...派生类必须重新实现基类函数,并且可以通过多态性实现运行时动态绑定。 这种继承关系强调了对函数接口统一定义,为实现多态提供了基础。...,也称为静态多态, 比如:函数重载 动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到类型确定程序具体行为,调用具体函数,也称为动态多态

20710

C++:14---虚继承,虚函数多态

最后构造D 如果虚基类构造函数为带参构造,则其子类,以及子类拓展出来子类,都要在成员初始化列表对其进行构造函数初始化 ddata赋值为1,继承于B、C,分别赋值为2,3,顺序为从左至右。...地址解析: B和C中都保存了A值,但是在D继承B和C时候,只保存了一份A,且放在最后 在D继承B和C内存段中分别有一个函数指针放在最前方 二、虚函数表 1.概念:是一块连续内存,所有虚函数首地址都存放在虚函数表中...,其大小为4字节 2.注意 只有类中有虚函数时,才有虚函数表 父子类之间函数表是不同地址,且虚函数表中函数首地址也不同 class A { public: virtual void run1...Bshow(),因为没有函数virtual关键字,所以函数调用看是对象类型,此处B类型,所以调用是Bshow()。...B中show()函数访问是B类后四节data数据,现在pb指针指向是4字节空间,后面4字节不确定,因此为垃圾值。 ?

67510

C++多态

引用或指针静态类型与动态类型不同这一事实正是C++语言支持多态根本所在。...在C++中,基类必须将他两种成员函数区分开来: 1.基类希望其派生类经行覆盖函数; 2.基类希望子类直接继承而不修改函数。...2.5C++11 override 和 final 从上面可以看出, C++函数重写要求比较严格,但是有些情况下由于疏忽,可能会导致函数 名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出...其实这个函数确实进了虚表只是被隐藏了,如果对这方面还有疑惑可以看看这篇文章。 4.2多态原理 上面分析了这个半天了那么多态原理到底是什么?...再通过下面的汇编代码分析,看出满足多态以后函数调用,不是在编译时确定,是运行 起来以后到对象中取找。不满足多态函数调用时编译时确认好。 4.3动态绑定与静态绑定 1.

11310

C++多态

C++多态 多态概念 多态定义与实现 多态构成条件与虚函数函数重写 C++11 override 和 final 重载、覆盖(重写)、隐藏(重定义)对比 抽象类 多态原理 虚函数表 原理与动静态绑定...单继承与多继承关系函数列表 单继承函数表 多继承函数表 菱形虚拟继承 继承与多态常见问题 多态概念 多态概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同对象去完成时会产生出不同状态...多态定义与实现 多态构成条件与虚函数 多态很重要前提就是先继承。 并且要去用基类指针或者是引用去调用虚函数 被调用函数必须是虚函数,且派生类必须对基类函数进行重写。...虚函数继承是一种接口继承,派生类继承是基类虚函数接口,目的是为了重写,达成多态,继承是接口。所以如果不实现多态,不要把函数定义成虚函数。 下面程序输出什么?...静态多态和动态多态。就是重载和虚函数重写。 2.内联函数能不能是虚函数呢?

25490

C++多态

多态定义及实现 构成多态条件 首先来看看构成多态条件: 多态是建立在继承之上多态是在不同继承关系类对象,去调用同一函数,产生了不同行为。比如Student继承了Person。...那么在继承中,需要以下条件才能构成多态: ①被调用函数必须是虚函数,且派生类必须对基类函数进行重写/覆盖。 ②必须通过基类指针或引用调用虚函数。...但是构成多态后,就便是与sd、st有关了。 虚函数 什么是虚函数 构成多态条件是1.虚函数重写2.基类指针或引用去调用虚函数。那么虚函数就是被virtual修饰类成员函数称为虚函数。...②接口继承: 虚函数继承是一种接口继承,派生类继承是基类虚函数接口,目的是为了重写,达成多态,继承是接口。所以如果不实现多态,不要把函数定义成虚函数。...反思构成多态条件 通过分析,我们可以好好反思一下构成多态条件,为什么要虚函数重写,为什么要基类对象指针或引用调用虚函数。 ①为什么虚函数覆盖/重写: 因为要对派生类虚表进行覆盖。

81820

C++多态

简单说,就是一句话:允许将子类类型指针赋值给父类类型指针。多态性在Object Pascal和C++中都是通过虚函数实现。 --百度百科 由以上解释大致可以了解到多态含义。...对于C++来说,多态就是同一个函数不同执行效果。实现方式就是子类根据自身需要更改了从父类继承方法。 2. 基本语法 C++支持多种多态,从实现形式上概括,有虚函数、重载等。...简单地来讲:静态多态是指在编译后就已经绑定,主要实现形式有函数模板和类方法重载;动态多态是指在运行期间才能确定,主要实现形式为基类函数继承。...,静态多态是通过重载方式来实现;动态方式则是通过继承和虚函数来实现。...归纳总结 主要介绍C++静态多态与动态多态区别,结合实际场景例子加深对多态理解。

35010

C++多态

---- 前言 多态 是面向对象三大基本特征中最后一个,多态 可以实现 “一个接口,多种方法”,比如父子类中同名方法,在增加了多态后,调用同名函数时,可以根据不同对象(父类对象或子类对象)调用属于自己函数...,父类是看不到并且无法调用 向父类/子类中添加非虚函数时:不属于虚函数,不进入虚表,仅当作普通类成员函数处理 5.2、多继承中虚表 C++ 中支持多继承,这也就意味着可能出现 多个虚函数重写 情况...,是因为调用方式不同,后继承类中虚表需要通过 this 指针修正方式调用虚函数 5.3、菱形继承多态与菱形虚拟继承多态(了解) 菱形继承问题是 C++ 多继承中大坑,为了解决菱形继承问题,提出了...:表示当前虚基表距离虚表有多远 因为这种写法过于复杂,所以在实际中一般不会使用,更不会去考 如果感兴趣同学可以看看下面这两篇相关文章: 《C++函数表解析》 《C++对象内存布局》 ----...没有实现多态时,两者一样快 实现多态后,普通函数速度快,因为虚函数还需要去虚表中调用 ---- 总结 以上就是本次关于 C++多态全部内容了,在本篇文章中,我们重点介绍了多态相关知识,如什么是多态

10930

C++多态

注:可能设计 C++ 大佬也是考虑到这样场景才设计出子类虚函数可以省略 virtual 语法。...5、C++11 override 和 final 从上面可以看出,C++ 对虚函数重写要求是非常严格,但是有些情况下由于疏忽,可能会发生函数名字母次序写反等问题,从而导致无法构成重写,而这种错误在编译期间是不会报出...: C++函数表解析 | 酷 壳 - CoolShell C++ 对象内存布局 | 酷 壳 - CoolShell ---- 五、继承和多态常见面试问题 1、概念考察 下面哪种面向对象方法可以让你变得富有...– 虚函数表在编译阶段生成,存在于代码段/常量区,并且同一类型共享一张虚表。 C++菱形继承存在问题?虚继承是如何解决菱形继承存在问题?-- 参照上一节继承。 什么是抽象类?抽象类作用?...结语:继承和多态C++ 中非常重要两个知识点,在面试中出现十分频繁,希望大家能真正把它理解,而不是浅尝辄止,亦或是在面试前背八股突击。 ----

44300

C++多态

面向对象程序设计三大要素之一就是多态多态是指基类指针指向不同派生类,其行为不同。...多态实现主要是通过虚函数和虚表来完成,虚表保存在对象头四个字节,要调用虚函数必须存在对象,也就是说虚函数必须作为类成员函数来使用。...showClass,在调用时用分别利用基类指针指向基类和派生类对象来调用这个虚函数,得到结果自然是不同,这样构成了多态。...由于虚函数表中函数是在编译时就根据对象不同将对应函数装入到各自对象函数表中,因此,不同对象所拥有的虚函数表不同,最终根据虚函数表寻址到函数也就不同,这样就构成了多态。...,没有构成多态,查表只会降低程序运行效率。

34020

C++多态

本章内容旨在解决以下几个问题: 什么是 C++ 多态C++ 多态实现原理是什么 什么是虚函数,虚函数实现原理是什么 什么是虚表,虚表内存结构布局如何,虚表第一项(或第二项)是什么 菱形继承(...size计算 什么是 C++ 多态C++ 多态实现原理是什么 在 C++ 程序设计中,多态性是指具有不同功能函数可以用同一个函数名,这样就可以用一个函数名调用不同内容函数。...在C++中主要分为静态多态和动态多态两种,在程序运行前就完成联编称为静态多态,主要通过函数重载和模板实现,动态多态在程序运行时才完成联编,主要通过虚函数实现。...如果对象类型是派生类,就调用派生类函数;如果对象类型是基类,就调用基类函数。运行期多态就是通过虚函数和虚函数表实现。...虚函数作用主要是实现了多态机制,基类定义虚函数,子类可以重写该函数;在派生类中对基类定义函数进行重写时,需要在派生类中声明该方法为虚方法,否则将会形成覆盖。

1.7K10

C++:13---多态和虚函数

多态意思为“以一个public基类指针/引用,寻址一个派生类对象”。 “多态关键在于通过基类指针或引用调用一个虚函数时,编译时不确定到底调用是基类还是派生类函数,运行时才确定。...实际上,任何有虚函数类及其派生类对象都包含这多出来 4 个字节,这 4 个字节就是实现多态关键——它位于对象存储空间最前端,其中存放是虚函数地址。...图2:类B对象存储空间以及虚函数多态函数调用语句被编译成根据基类指针所指向(或基类引用所引用)对象中存放函数地址,在虚函数表中查找虚函数地址,并调用虚函数一系列指令。...由以上过程可以看出,只要是通过基类指针或基类引用调用虚函数语句,就一定是多态,也一定会执行上面的查表过程,哪怕这个虚函数仅在基类中有,在派生类中没有。...多态机制能够提高程序开发效率,但是也增加了程序运行时开销。虚函数表、各个对象中包含 4 个字节函数地址都是空间上额外开销;而查虚函数过程则是时间上额外开销。

67120

C++中虚函数多态实现原理刨析

多态实现原理刨析 虚函数关键字:virtual 未写virtual关键字前: #include using namespace std; class Animal { public...区别: 代码本意是调用猫类里面的speak函数,但是未在父类speak函数前加virtual关键字时,调用是父类speak函数,加了virtual关键字后,调用是猫类里面的speak函数,这就是多态...在深入探究多态实现原理前,先要理解多态意思和虚函数实现条件 多态: 不同类对象对同一消息不同响应 注意: 虚函数实现条件 : 1.有继承关系 2.子类重写父类函数 动态多态使用...: 父类指针或者引用指向子类对象 多态实现原理探究: 未写虚函数前: #include using namespace std; class Animal { public:...当发生虚函数重写时,子类会把自己函数覆盖掉之前父类函数 因此当父类指针或者引用指向子类对象时候,会发生多态,你传入是cat对象,就去cat函数表中找speak函数入口地址

43710

C++多态

多态定义及实现 2.1多态构成条件 2.2 虚函数 2.3 虚函数重写 2.4 笔试题 2.5 C++11 override 和 final 2.6 重载、覆盖(重写)、隐藏(重定义)对比 3....多态原理 3.1 虚函数表 3.2 多态原理 4. 单继承和多继承关系函数表 4.1 单继承中函数表 4.2 多继承中函数表 5. 抽象类 1....多态定义及实现 2.1多态构成条件 不同的人做同一件事情,多种形态,结果是不一样多态是在不同继承关系类对象,去调用同一函数,产生了不同行为。比如Student继承了 Person。...当构成多态调用时候,重写函数体实现,函数结构部分(函数名、参数、返回值)用是父类。...: 2.5 C++11 override 和 final 从上面可以看出,C++函数重写要求比较严格,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出

6910

C++多态

多态原理 当类存在虚函数时,编译器会为该类维护一个表,这个表就是虚函数表(vtbl),里面存放了该类虚函数函数指针。在构造类时候增加一个虚表指针(vptr)指向对应函数表。...在类执行成员函数时候,先判断该函数是否是虚函数,如果不是虚函数则直接执行对应方法,如果是虚函数则从虚函数表中找到应该调用函数。 vptr初始化是在类构造时候完成。...父类指针(引用)指向子类进行多态调用时候,编译器并不关系是子类还是父类,而是通过vptr指向btbl来找到对应函数指针,并调用函数。...4.3“隐藏”是指派生类函数屏蔽了与其同名基类函数,特征是: (1)如果派生类函数与基类函数同名,但是参数不同,此时,不论有无virtual关键字,基类函数将被隐藏(注意别与重载混淆)。...Parent 1 Parent 10 测试二,对print方法加上virtual关键字,这时才体现出多态 Parent 1 Children 10

43030
领券