首页
学习
活动
专区
圈层
工具
发布

C++多态与虚函数

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

52620

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; } }; 虚函数的几大限制 只有成员函数才能是虚函数,因为虚函数仅适用于有继承关系的类对象。

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

    C++多态与虚函数

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

    51910

    C++多态虚函数动态绑定

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

    1.8K20

    【C++:多态】深入剖析C++多态精髓:虚函数机制、重写规范与现代C++多态控制

    ,为万世开太平 艾莉丝的简介: ​​ 艾莉丝的C++专栏简介: ​​ 目录 C++的两个参考文档 1 ~> 认识多态:面向对象编程的灵魂 1.1 多态的核心概念解析 1.2 联系实际:现实世界中的多态类比...2 ~> 多态的实现机制深度探索 2.1 多态的本质与构成必要条件 2.1.1 多态的科学定义 2.1.2 实现多态的双重关键条件 2.2 虚函数:多态的基石 2.3 虚函数重写(覆盖)...2.6.6 多态虚函数重写知识体系思维导图 2.7 现代C++多态控制:override和final 2.7.1 override/final的设计哲学 2.7.2 override/final...结尾 C++的两个参考文档 老朋友(非官方文档):cplusplus 官方文档(同步更新):cppreference ​ 1 ~> 认识多态:面向对象编程的灵魂 1.1 多态的核心概念解析...2.6.6 多态虚函数重写知识体系思维导图 2.7 现代C++多态控制:override和final 在【继承】中,艾莉丝就介绍了final这个关键字,当时艾莉丝做了个小小的“预告”,今天要解密了!

    22910

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

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

    46040

    【c++】多态(多态的概念及实现、虚函数重写、纯虚函数和抽象类、虚函数表、多态的实现过程)

    多态可以分为编译时多态(静态多态)和运行时多态(动态多态)。在之前的学习当中,我们已经接触过编译时多态,例如函数重载和函数模板。本篇文章,博主主要和大家分享运行时多态的相关知识。...运行结果: 结论:基类当中的析构函数建议设计为析构函数。 2.5 c++11关键字:override和final 不难发现,c++对虚函数重写的要求十分严格。...派生类的虚函数表包含三个部分:基类的虚函数地址、由于派生类重写而覆盖的虚函数地址、派生类自己的虚函数地址。 5. c++标准并没有规定虚函数表位于内存哪一个区域,vs下默认位于代码段。 2....多态的实现过程 总的来说,多态的实现过程是:首先根据规则创建虚函数表,在虚函数表中存储相应的虚函数地址,然后在基类和派生类中添加虚函数表指针,最后通过指向的虚函数表来调用相应的虚函数或重写函数...从多态的概念、多态的构成条件到多态的实现、多态的原理,以及多态在编程中的应用,我们进行了全面而深入的学习。如果你觉得博主讲的还不错,就请留下一个小小的赞在走哦,感谢大家的支持❤❤❤

    1.1K21

    【C++】多态(定义、虚函数、重写、隐藏)

    今日更新了多态的相关内容 欢迎大家关注点赞收藏⭐️留言 多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态。...多态的定义及实现 多态的构成条件 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。...虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成 多态,继承的是接口。所以如果不实现多态,不要把函数定义成虚函数。...多态的原理 虚函数表 这里的代码是在x86程序中,涉及的指针都是4字节。...如果我们要达到多态,有两个条件,一个是虚函数覆盖,一个是对象的指针或引用调 用虚函数。 满足多态以后的函数调用,不是在编译时确定的,是运行起来以后到对象中取找的。

    49910

    【c++】多态(2)---多态的原理

    这次带来的是C++中关于多态这部分的一些知识点,如果对你有所帮助的话,可否留下你宝贵的三连呢?...二、多态是如何实现的? 关于编译时多态:主要通过函数重载和模板实现,在编译阶段就能确定具体调用哪个函数的多态形式(静态绑定)。...关于运行时多态:主要通过虚函数重写实现,在编译阶段不能确定具体调用哪个函数的多态形式,需要在运行时通过传递一个对象来确定。它的实现取决于虚函数表的存在。...满足多态条件的函数调用是在运行的时候绑定,也就是在运行时到指定对象的虚函数表中找到调用函数的地址,叫做动态绑定。 反汇编: 四、虚函数表 基类对象的虚函数表中存放所有虚函数的地址。...在一些常见的编译器(如vs,g++)会把派生类独有的虚函数地址放在第一章虚函数表里面。这个c++标准没有规定。

    8710

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

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

    57320

    揭秘C++多态背后的虚函数表机制

    ok,这就需要我们对多态的底层有一定的了解—— 二、多态的原理 2.1 虚函数表指针 当我们运行上面题目中的代码时,会发现b的成员好像不止两个—— 除了_b和_ch成员外,还有一个_vfptr,_vfptr...虚函数和普通函数的真正区别是—— 普通函数就像之前那样调用;而虚函数要实现多态调用,所以虚函数要实现多态调用,它就要把它的地址放进虚函数表中,多态的核心就要靠着这个虚函数表来实现的 所以上面那道题选择D...,多态的核心就要靠着这个虚函数表来实现的 总结:(很重要) 普通调用时编译时确定地址 多态调用时运行时到指向的对象中找到这个虚函数表指针,然后通过虚函数表指针找到虚函数表,在虚函数表中找到相应的虚函数,...多态分为静态多态和动态多态 静态多态是编译式确定的多态(编译时确定地址),它就是一个同名函数因为参数的不同而表现出多种形态 动态多态是指用一个基类的指针或者引用去调用函数,并且这个被调用的函数是虚函数并完成重写...这个问题严格说并没有标准答案,C++标准并没有规定,但是我们写下面的代码可以对比验证一下。

    23610

    【C++指南】函数重载:多态性的基石

    引言 在C++编程中,函数重载(是一项核心特性,它允许在同一作用域内定义多个同名的函数,只要这些函数的参数列表(包括参数的数量、类型或顺序)不同即可。...这一特性极大地增强了C++语言的表达力和灵活性,是C++多态性概念的重要体现之一。 本文将深入探讨C++函数重载的概念、原理、应用场景以及最佳实践,旨在帮助读者更好地理解和应用这一特性。...二、函数重载的原理 C++编译器在编译时,会根据函数调用的上下文(即函数调用时提供的参数),来确定应该调用哪个具体的函数。 这一过程是通过名称修饰和函数签名匹配来实现的。...文章后面也会讲到,返回类型不会作为函数重载的依据 简单来说,函数重载是通过函数名相同+参数列表不同来实现的 三、函数重载的应用场景 函数重载在C++编程中有着广泛的应用场景,包括但不限于以下几个方面...总结 C++函数重载是C++多态性概念的重要体现之一,它允许在同一作用域内定义多个同名的函数,只要它们的参数列表不同即可。

    49410

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

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

    89010

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

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

    96210

    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函数的入口地址

    67210

    【C++】多态

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

    39610

    C++多态

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

    48590

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

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

    84720

    【C++】多态 ② ( 面向对象中 “ 多态 “ 的真正需求 | 面向对象 “ 多态 “ 实现 - virtual 修饰函数 | 代码示例 )

    一、多态实现 1、面向对象中 " 多态 " 的真正需求 在上一篇博客 【C++】多态 ① ( 类型兼容性原则与函数重写 | “ 多态 “ 引入 | 函数重写 ) 中 , 进行了测试 , 在测试代码中..., 这并不是我们想要的 ; 上述测试中 , 根据实际的 对象类型 确定 重写函数 中要调用 父类 还是 子类 中的函数 , 并不是我们期望的 ; 多态 的 需求是 : 相同的调用语句 , 有多种不通的表现形态...调用的 是 父类的函数 , 这样才 符合 多态 的理念 ; 实际对象是子类 , 调用子类的函数 ; 通过 父类指针 可以调用 子类中重写的函数 , 根据 指针 指向的不同 , 调用不同类 的 函数 ,...指针 指向 父类 , 就调用父类的函数 ; 指针 指向 子类 , 就调用 子类的函数 ; 2、面向对象 " 多态 " 实现 - virtual 修饰函数 C++ 语言中 , 通过使用 virtual...关键字 , 实现对 多态的支持 ; 子类 重写 父类 的 函数 , 在 父类 或 子类 中 , 使用 virtual 关键字 修饰 该函数 , 即可实现 多态 的特性 ; 在 父类 中 , 使用 virtual

    41120

    《C++ 多态》三大面向对象编程——多态:虚函数机制、重写规范与现代C++多态控制全概要

    就像生活中 “播放” 这一行为,音乐播放器播放歌曲、视频播放器播放影片、幻灯片播放器展示画面 —— 接口一致但表现形式各异;在 C++ 中,多态让我们通过基类的统一接口,调用不同派生类的专属实现,无需修改调用逻辑就能适配多样化的业务需求...多态的科学定义 多态是一个继承关系的下的类对象,去调用同一函数,产生了不同的行为。...这个的答案就是D了, 这里的func函数只有在多态的时候才会走重写的这个机制。 即派生类是由多态调用的时候,父类虚函数声明+子类实现构成这个虚函数。...派生类的析构函数没有调用,就有可能造成内存泄漏 2.7 现代C++多态控制:override和final 2.7.1 override/final的设计哲学 从上面可以看出,C++对虚函数重写的要求比较严格...+ 继承》三大面向对象编程——继承:派生类构造、多继承、菱形虚拟继承概要 结语:多态是 C++ 面向对象编程的 “终极特性” 之一,它以继承为基础,通过虚函数实现 “同一接口,不同实现”,让代码兼具灵活性

    23410
    领券