首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏C++与Linux的学习之路

    C++多态

    C++多态 多态的概念 多态的定义与实现 多态的构成条件与虚函数 虚函数的重写 C++11 override 和 final 重载、覆盖(重写)、隐藏(重定义)的对比 抽象类 多态原理 虚函数表 原理与动静态绑定 多态的定义与实现 多态的构成条件与虚函数 多态很重要的前提就是先继承。 并且要去用基类的指针或者是引用去调用虚函数 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。 = &d; return 0; } A:p1 == p2 == p3 B:p1 < p2 < p3 C:p1 == p3 ! 静态的多态和动态的多态。就是重载和虚函数的重写。 2.内联函数能不能是虚函数呢? 也就是说,如果是多态调用就没有内联属性,但是普通调用可以继续保持内联属性。 3.为什么父类的对象无法完成多态调用呢?

    51890编辑于 2023-04-06
  • 来自专栏后端学习之旅

    C++多态

    引用或指针的静态类型与动态类型不同这一事实正是C++语言支持多态性的根本所在。 在C++中,基类必须将他的两种成员函数区分开来: 1.基类希望其派生类经行覆盖的函数; 2.基类希望子类直接继承而不修改的函数。 2.5C++11 override 和 final 从上面可以看出, C++ 对函数重写的要求比较严格,但是有些情况下由于疏忽,可能会导致函数 名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出的 3. 另外Func2继承下来后是虚函数,所以放进了虚表,Func3也继承下来了,但是不是虚函 数,所以不会放进虚表。 4. 3. 这样就实现出了不同对象去完成同一行为时,展现出不同的形态。 4. 反过来思考我们要达到多态,有两个条件,一个是虚函数覆盖,一个是对象的指针或引调 用虚函数。 5.

    43110编辑于 2024-01-22
  • 来自专栏zxctscl个人专栏

    C++多态

    多态的概念 2. 多态的定义及实现 2.1多态的构成条件 2.2 虚函数 2.3 虚函数的重写 2.4 笔试题 2.5 C++11 override 和 final 2.6 重载、覆盖(重写)、隐藏(重定义)的对比 3. 多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 下面说法正确的是( ) A:p1 == p2 == p3 B:p1 < p2 < p3 C:p1 == p3 != p2 D:p1 != p2 ! = &d; return 0; } 此时: p2和p3的地址就是相同的: 2.5 C++11 override 和 final 从上面可以看出,C++对函数重写的要求比较严格,但是有些情况下由于疏忽

    38010编辑于 2024-04-25
  • 来自专栏流媒体

    C++多态

    多态原理 当类存在虚函数时,编译器会为该类维护一个表,这个表就是虚函数表(vtbl),里面存放了该类虚函数的函数指针。在构造类的时候增加一个虚表指针(vptr)指向对应的虚函数表。 父类指针(引用)指向子类进行多态调用时候,编译器并不关系是子类还是父类,而是通过vptr指向的btbl来找到对应的函数指针,并调用函数。 vtbl由编译器来维护 重载、覆盖、隐藏的区别和执行方式 4.1成员函数被重载的特征 (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual 关键字可有可无 4.2“覆盖”是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别位于派生类与基类); (2)函数名字相同; (3)参数相同; (4)基类函数必须有virtual 关键字。 ); } 测试一运行结果,发现虽然父类指针或引用指向了子类,但是在调用方法时候还是调用的父类的方法 Parent 1 Parent 10 测试二,对print方法加上virtual关键字,这时才体现出多态

    63430发布于 2018-08-23
  • 来自专栏学习

    C++多态

    多态分为编译时多态(静态多态)和运⾏时多态(动态多态),这⾥我们重点讲运⾏时多态,编译时多态(静态多态)和运⾏时多态(动态多态)。 2.1.7 重载/重写/隐藏的对比 注意:这个概念对⽐经常考,⼤家得理解记忆⼀下 3. (这个C++并没有进⾏规定,各个编译器⾃⾏定义的,vs系列编译器会再后⾯放个0x00000000 标记,g++系列编译不会放) 虚函数存在哪的? 这个问题严格说并没有标准答案C++标准并没有规定,我们写下⾯的代码可以 对⽐验证⼀下。 \n", &Base::func1); printf("普通函数地址:%p\n", &Base::func5); return 0; } 运行结果: 可以看到虚表是存放在常量区的 不同平台有所不同C+

    28600编辑于 2024-11-22
  • 来自专栏YIN_尹的博客

    C++多态

    之前的文章我们学习了C++的继承,这篇文章我们来学习多态 前言 需要声明的,本文中的代码及解释都是在vs2022下的x86程序中,涉及的指针都是4bytes。 多态的概念 多态的概念: 通俗来说,多态就是多种形态;具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 3 虚函数重写的两个例外 3.1 析构函数的重写 我们来看这样一种场景: 还是Person和Student两个类,STUdent继承Person,它们都显示实现了自己的析构,我们运行程序 这没什么问题 ,是不是多态就上场了。 用多态是不是就可以达到这样的效果啊。 那现在怎么实现多态,是不是把父类的析构变成虚函数,然后子类重写就行了啊。 3. 做一道笔试题 下面我们看一道题目 问:以下程序输出结果是什么() 大家先自己看看题,认真分析一下。 我们来一起分析一下: 首先,父类里面有两个虚函数:func和test。

    43910编辑于 2024-01-23
  • 来自专栏MasiMaro 的技术博文

    C++多态

    面向对象的程序设计的三大要素之一就是多态多态是指基类的指针指向不同的派生类,其行为不同。 多态的实现主要是通过虚函数和虚表来完成,虚表保存在对象的头四个字节,要调用虚函数必须存在对象,也就是说虚函数必须作为类的成员函数来使用。 获取虚函数表指针 004012AF call dword ptr [edx];调转到虚函数指针所对应的位置执行代码 004012B1 cmp esi,esp 004012B3 showClass(); 004012BE mov ecx,dword ptr [ebp-4] 004012C1 mov edx,dword ptr [ecx] 004012C3 由于虚函数表中的虚函数是在编译时就根据对象的不同将对应的函数装入到各自对象的虚函数表中,因此,不同的对象所拥有的虚函数表不同,最终根据虚函数表寻址到的虚函数也就不同,这样就构成了多态

    54120发布于 2019-02-25
  • 来自专栏CV学习史

    C++多态

    本章内容旨在解决以下几个问题: 什么是 C++ 多态C++ 多态的实现原理是什么 什么是虚函数,虚函数的实现原理是什么 什么是虚表,虚表的内存结构布局如何,虚表的第一项(或第二项)是什么 菱形继承( + 多态C++ 多态的实现原理是什么 在 C++ 程序设计中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。 在C++中主要分为静态多态和动态多态两种,在程序运行前就完成联编的称为静态多态,主要通过函数重载和模板实现,动态多态在程序运行时才完成联编,主要通过虚函数实现。 3 3 12 */ 虚函数示例: class A{ public: virtual void fun(){ cout << "hello A" << endl; } }; 8 */ 内存分布为 D B::n C::n 存在虚函数的类对象size计算 空类的大小为1,因为在C++中任何对象都需要有一个地址,最小为1。

    2.2K10发布于 2021-05-19
  • 来自专栏coding

    C++多态

    3.实现多态的条件 多态的实现效果: class Person { public: virtual void BuyTicket() { cout << "全价买票" << endl; } } 3.动态绑定与静态绑定 对不满足多态条件(指针+引用调用虚函数)的函数调用是在编译时绑定调用函数的地址,叫做静态绑定。 虚函数表的存储位置C++标准中没有规定,取决于不同编译器。在VS中,虚函数表是存储在常量区的。 下面这段代码可以验证下在VS中虚函数表是存储在常量区的。 什么是多态? 答:多态分为静态多态:函数重载;和动态多态:继承中的虚函数重写+基类指针引用。 2. 什么是重载、重写 ( 覆盖 ) 、重定义 ( 隐藏 ) ? 答:参考上述内容。 3. C++ 菱形继承的问题?虚继承的原理? 答:参考继承。注意这里不要把虚函数表和虚基表搞混了。 11. 什么是抽象类?抽象类的作用? 答:参考上述内容。

    47410编辑于 2024-11-26
  • C++多态

    多态 ✨前言:在 C++ 的世界里,“多态(polymorphism)” 是面向对象编程的灵魂之一。 它让同一个接口在不同对象上表现出不同的行为,从而大大提升了代码的复用性、扩展性与灵活性。 专栏:【C++成长之旅】 一、多态的概念 多态(polymorphism)的概念:通俗来说,就是多种形态。 虚函数表是 C++ 实现运行时多态的核心机制。 我们也可以看出,虚表中存储的其实就是虚函数指针,所以虚表本质就是函数指针数组。 然后我们再来输入的看一下它是如何实现多态的。 ecx,dword ptr [ptr] 001B3C3C mov eax,dword ptr [edx] 001B3C3E call eax 涉及到会汇编, 总结 多态让“同一接口”在“不同对象”上拥有“不同实现”,是让 C++ 面向对象思想真正落地的关键。

    29010编辑于 2026-01-13
  • 来自专栏开源519

    C++多态

    多态性在Object Pascal和C++中都是通过虚函数实现的。 --百度百科 由以上解释大致可以了解到多态的含义。对于C++来说,多态就是同一个函数不同的执行效果。 基本语法 C++支持多种多态,从实现形式上概括,有虚函数、重载等。从绑定时间,分为静态多态和动态多态,又称为编译期多态和运行期多态。 重载方式: " << endl; pd.print(5); // 输出浮点数 pd.print(500.263); // 输出字符串 char c[] = "Hello <em>C+</em> <em>3</em> 拓展延伸 问题:利用<em>多态</em>实现正方形与圆形的面积计算。 要求1. 实现基类,内部成员包括显示类类元素方法、显示面积方法、面积计算方法 要求2. 归纳总结 主要介绍<em>C++</em>静态<em>多态</em>与动态<em>多态</em>的区别,结合实际的场景例子加深对<em>多态</em>的理解。

    58110发布于 2020-11-03
  • 来自专栏用户10155340的专栏

    C++多态

    ,是因为调用方式不同,后继承类中的虚表需要通过 this 指针修正的方式调用虚函数 5.3、菱形继承多态与菱形虚拟继承多态(了解) 菱形继承问题是 C++ 多继承中的大坑,为了解决菱形继承问题,提出了 :表示当前虚基表距离虚表有多远 因为这种写法过于复杂,所以在实际中一般不会使用,更不会去考 如果感兴趣的同学可以看看下面这两篇相关文章: 《C++虚函数表解析》 《C++对象的内存布局》 ---- = p3 答案: A A D A C 6.2、综合问答(简答) 1.什么是多态多态是指不同继承关系的类对象,去调用同一函数,产生了不同的行为。 多态又分为静态的多态和动态的多态 2.为什么要在父类析构函数前加上 virtual 修饰? 与子类析构函数构成多态,确保析构函数能被成功调用 3.什么是重载、重写、重定义? 没有实现多态时,两者一样快 实现多态后,普通函数速度快,因为虚函数还需要去虚表中调用 ---- 总结 以上就是本次关于 C++多态】的全部内容了,在本篇文章中,我们重点介绍了多态的相关知识,如什么是多态

    44530编辑于 2023-07-01
  • 来自专栏学习

    C++多态

    前言 本篇博客我们来介绍多态知识的总结,这一部分面试官特别爱提问,也是我们需要注意的 个人主页:小张同学zkf ⏩ 文章专栏:C++ 若有问题 评论区见 欢迎大家点赞收藏⭐文章 1.多态的概念 多态分为 编译时多态(静态多态) 和 运⾏时多态(动态多态) ,编译时多态(静态多态)主要就是我们前⾯总结的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同函数,通过参数不同达到多种形态,之所以叫编译时多态 ; 28 delete p2; 29 30 return 0 ; 31 } 2.5override 和 final关键字 从上⾯可以看出,C+ (这个C++并没有进⾏规定,各个编译器⾃⾏定义的,vs系列编译器会再后⾯放个0x00000000标记,g++系列编译不会放) • 虚函数存在哪的? 这个问题严格说并没有标准答案C++标准并没有规定 结束语 多态这部分知识点总结完了,这一部分有些问题面试官特别爱提,需要好好记忆 OK,本篇博客结束!!!

    33010编辑于 2024-09-25
  • 来自专栏南桥谈编程

    C++多态

    多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 多态的定义及实现 构成多态的条件 不同的对象去做同一件事,展现出多种形态,结果不一样。 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。Student继承了 Person。 要实现C++多态,需满足以下两个条件: 父子类完成虚函数重写(函数名、参数、返回值相同),子类虚函数重写了虚函数 父类的指针或者引用去调用虚函数 从而满足指向谁调用谁的虚函数。 但是,在 C++ 中,默认参数的绑定是在编译时确定的,而不是运行时。 = p3 运行结果: C++11 override 和 final C++对函数重写的要求比较严格,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出的

    35910编辑于 2024-08-07
  • 来自专栏转自CSDN

    C++ 多态

    多态概念 多态性是面向对象编程中的一个核心概念,它允许对象通过统一的接口表现出不同的行为。多态性增强了程序的灵活性和可扩展性。 编译时多态(静态多态) 编译时多态,也称为静态多态或早绑定(early binding),是在编译阶段确定调用哪个函数或方法。这主要通过函数重载和模板来实现。 运行时多态(动态多态) 运行时多态,也称为动态绑定(dynamic binding)或晚绑定(late binding),是在运行时确定调用哪个函数或方法。 多态实现 多态需要继承关系,在继承关系下调用同一函数产生不同行为。 { cout << a << "A" << endl; } }; class B :public A { public: void P(int a = 1)//这里打印出来的a是0 如果按照多态来调用

    39910编辑于 2025-01-21
  • 来自专栏C语言

    C++多态

    但是C++对于缺省值是否相同不做规定,缺省值不同,参数列表依然可以达成一致,同时形参的名称也不做要求,可以起一样的名称。 首先针对func函数,A与B中func有virtual修饰、参数列表(C++对缺省值不做规定)相同、返回值相同、派生类中的func对A中func的实现进行了重写,所以A、B中的func满足多态的基本条件 但是这里要介绍的是C++中重写的本质实质上是重写函数的实现,根据“绝不重新定义继承而来的缺省参数值”(《Effective》C++,侯捷,第37条款)这一条款,派生类的虚函数实际上是由两部分组成的,函数声明部分是采用基类的声明 (这个C++并没有进行规定,各个编译器自行定义的,vs系列编译器会再后面放个0x00000000标记,g++系列编译不会放) • 虚函数存在哪的? 这个问题严格说并没有标准答案C++标准并没有规定,我们写下面的代码可以对比验证一下。

    36010编辑于 2025-01-02
  • 来自专栏C++&linux

    C++多态

    3.多态调用 VS 普通调用 1. ,而且虚函数还会进虚表,这还会平白无故的增加性能的损耗,所以这个语法比较奇怪,平常用的时候肯定也不多见,由此也可以看出来C++委员会是真的在摸鱼啊。 多态调用编译时可确定不了函数的地址,因为无法根据调用者的类型确定函数地址,只能在运行时去当前指针所指对象的虚函数表里面找,找到对应的虚函数地址才可以进行调用。 3. 这张图片是从某篇文章拿出来的,不过这个问题不是很紧要,因为.rodata段和代码段的位置非常的接近,并且在常量区也更加的合理,因为虚表指针不能被修改,放在只读数据段或者代码段感觉都也行,我不是研究操作系统的,就是靠C+ 3.多态的实现原理?

    80020编辑于 2023-04-12
  • 来自专栏QT

    c++多态

    多态性允许不同的类对同一消息做出不同的响应,增强了代码的灵活性和可扩展性。多态分为运行时多态(动态多态)和,编译时多态(静态多态),在这里我们主要介绍运行时多态。 编译时多态(静态多态) 编译时多态就是我们前边讲的函数重载和函数模板,传不同的参数就会调用不同的函数,通过参数不同来达到多种形态。 运行时多态(动态多态) 不同于编译时多态,运行时多态在编译时还没有确认要调用函数,在要调用一个函数时,不同的对象去调用,完成的行为是不一样的。 运行时多态通过不同类型的对象去调用实现多种形态,编译时多态通过参数匹配来实现多种形态。 多态的定义和实现 多态是继承关系下的类对象,去调用同一函数,产生不同的行为。 return 0; } override和final关键字 从上⾯可以看出,C++对虚函数重写的要求⽐较严格,但是有些情况下由于疏忽,⽐如函数名写错参数写错等导致⽆法构成重写,⽽这种错误在编译期间是不会报出的

    20710编辑于 2025-12-30
  • 来自专栏跟我一起学编程

    C++】———— 多态

    一、什么是多态 什么是多态呢?通俗的来讲,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生不同的状态。 二、多态的定义和实现 1.多态构成条件 在继承中要形成多态还有两个条件: 调用时必须要通过基类的指针或者引用调用虚函数 被调用的函数必须是虚函数,且派生类必须含有对基类的虚函数的重写 这里我们插入一个概念 下面我们接着来看多态,我们先来看一串多态的代码: class Person { public: virtual void BuyTicket() { cout << "买票-全价" << endl; 我们给析构函数添加上virtual 发现子类对象,Student对象就能正常析构了 注意:析构函数加virtual是在new场景下才需要, 其他环境下可以不用 3.重载、覆盖(重写)、隐藏(重定义)的对比 虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成多态,继承的是接口。所以如果不实现多态,不要把函数定义成虚函数。

    39610编辑于 2024-07-15
  • 来自专栏c++

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

    这次带来的是C++中关于多态这部分的一些知识点,如果对你有所帮助的话,可否留下你宝贵的三连呢? 二、多态是如何实现的? 关于编译时多态:主要通过函数重载和模板实现,在编译阶段就能确定具体调用哪个函数的多态形式(静态绑定)。 关于运行时多态:主要通过虚函数重写实现,在编译阶段不能确定具体调用哪个函数的多态形式,需要在运行时通过传递一个对象来确定。它的实现取决于虚函数表的存在。 派生类重写的虚函数完成覆盖,3. 派生类自己的虚函数地址三个部分。关于3,毕竟派生类也可以作为基类被继承。 派生类的对象可能不只有一个虚函数表,毕竟它可以继承多个基类,拥有多个虚函数表。 这个c++标准没有规定。 虚函数表的本质其实就是一个函数指针数组,一般情况这个数组最后面放了一个0x00000000标记(vs下是这样,g++下没有)。 虚函数存在哪的?

    10210编辑于 2026-01-14
领券