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

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

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

    10210编辑于 2026-01-14
  • 来自专栏Initial programming

    初识C++ · 多态(2)

    前言: 多态(1)好像也不是很难?不不不,这里的菱形(虚拟)继承的多态是有点难度的,所以,打起精神来!!! 1 抽象类 抽象类是这个类里面包含了纯虚函数,就叫做抽象类,那么什么是纯虚函数呢? 2 单继承与多继承中的虚函数表 2.1 单继承中的虚表 单继承中的虚表在多态(1)里面已经提及到了,这里呢就简单过一下。 () { cout << "Base2::func1" << endl; } virtual void func2() { cout << "Base2::func2" << endl; } private 还能构成多态吗? 所以这里,我们可以画出Derive的对象模型: 所以大小为 4+4+4+4+4,一共为20,两个指针三个整型。 实际上菱形继承在这里和多继承中的多态是没有啥差别的,可以说是一模一样的。

    17610编辑于 2024-10-16
  • 来自专栏技术杂记

    C++基础(七).多态2

    类对象,初始化半径为2,指针赋给p[0] p[1] = new Rectangle(2,5); //申请一个Rectangle类对象,初始化高为2,宽为5,指针赋给p[1] p[2] = new p[0]; delete p[1]; delete p[2]; //进行清场工作 return 0; } 编译执行 emacs@ubuntu:~/c++$ alias gtx alias gtx='g++ -Wall -g -o' emacs@ubuntu:~/c++$ gtx shape.x shape.cpp emacs@ubuntu:~/c++$ . +$ 编译执行过程中没有报错,从结果来看,符合预期 ---- 总结 弄清下面概念对掌握c++很有帮助 多态:指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作,C++支持两种多态性:编译时多态性 ,运行时多态性(编译时多态性:通过重载函数实现 ;运行时多态性:通过虚函数实现) 虚函数 :在基类中被声明为virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态覆盖(Override)

    64210发布于 2021-09-15
  • C++多态的深度剖析(2

    // 这⾥就是静态绑定,编译器直接确定调⽤函数地址 ptr->BuyTicket(); 00EA2C91 mov ecx,dword ptr [ptr] 00EA2C94 call Student::Student (0EA153Ch) 虚函数表 虚函数表(Virtual Function Table,也常简称为vtable)是C++语言中实现多态的一种机制。 (这个C++并没有进⾏规定,各个编译器自行定义的,vs系列编译器会再后面放个0x00000000 标记,g++系列编译不会放) 虚函数存在哪的? 这个问题严格说并没有标准答案C++标准并没有规定, class Base { public: virtual void func1() { cout << "Base::func1" << endl; } virtual void func2() { cout << "Base::func2" << endl; } void func5() { cout << "Base::func5" <<

    13210编辑于 2025-12-19
  • 来自专栏C++与Linux的学习之路

    C++多态

    C++多态 多态的概念 多态的定义与实现 多态的构成条件与虚函数 虚函数的重写 C++11 override 和 final 重载、覆盖(重写)、隐藏(重定义)的对比 抽象类 多态原理 虚函数表 原理与动静态绑定 多态的定义与实现 多态的构成条件与虚函数 多态很重要的前提就是先继承。 并且要去用基类的指针或者是引用去调用虚函数 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。 Person* p = &s1; p->BuyTicket(); p = &s2; p->BuyTicket(); return 0; } 这里也叫做多态调用。 2.动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到的类型确定程序的具体行为,调用具体的函数,也称为动态多态。 那么虚表是放在哪一个位置呢? 静态的多态和动态的多态。就是重载和虚函数的重写。 2.内联函数能不能是虚函数呢?

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

    C++多态

    引用或指针的静态类型与动态类型不同这一事实正是C++语言支持多态性的根本所在。 那么在继承中要构成多态还有两个条件: 1. 必须通过基类的指针或者引用调用虚函数 2. 在C++中,基类必须将他的两种成员函数区分开来: 1.基类希望其派生类经行覆盖的函数; 2.基类希望子类直接继承而不修改的函数。 2. 静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序的行为,也称为静态多态, 比如:函数重载 2.

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

    C++多态

    多态的概念 2. 2. 多态的定义及实现 2.1多态的构成条件 不同的人做同一件事情,多种形态,结果是不一样的。 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。 ,是多态一个全价一个半价: 如果没有继承关系是不行的: 2. = new Student; delete p1; delete p2; return 0; } 这里就没有调到子类的析构: 不符合多态的时候调用:析构+operator delete(p1) 和 final 从上面可以看出,C++对函数重写的要求比较严格,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出的,只有在程序运行时没有得到预期结果才来

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

    C++多态

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

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

    C++多态

    多态分为编译时多态(静态多态)和运⾏时多态(动态多态),这⾥我们重点讲运⾏时多态,编译时多态(静态多态)和运⾏时多态(动态多态)。 2. 多态的定义及实现 2.1 多态的构成条件 多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了 Person。 p2; return 0; } 2.1.6 override 和 final关键字 从上⾯可以看出,C++对函数重写的要求⽐较严格,但是有些情况下由于疏忽,⽐如函数名写错参数写 错等导致⽆法构成重载 (这个C++并没有进⾏规定,各个编译器⾃⾏定义的,vs系列编译器会再后⾯放个0x00000000 标记,g++系列编译不会放) 虚函数存在哪的? 这个问题严格说并没有标准答案C++标准并没有规定,我们写下⾯的代码可以 对⽐验证⼀下。

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

    C++多态

    之前的文章我们学习了C++的继承,这篇文章我们来学习多态 前言 需要声明的,本文中的代码及解释都是在vs2022下的x86程序中,涉及的指针都是4bytes。 2. 多态的语法及实现 2.1 虚拟函数 要学习多态,首先我们要认识一下虚函数(虚拟函数) 虚函数:即被virtual关键字修饰的类成员函数 这里的BuyTicket就是一个虚函数。 2.2.2 条件2:基类的指针或者引用调用虚函数 第二个条件: 必须通过基类的指针或者引用调用虚函数 我们先学语法,后面会给大家讲原理。 在要释放的对象空间上执行析构函数,完成对象中资源的清理工作 2. 只有派生类Student的析构函数重写了Person的析构函数,delete对象调用析构函数,才能构成多态,才能保证p1和p2指向的对象正确的调用析构函数。

    44010编辑于 2024-01-23
  • C++多态

    多态 ✨前言:在 C++ 的世界里,“多态(polymorphism)” 是面向对象编程的灵魂之一。 它让同一个接口在不同对象上表现出不同的行为,从而大大提升了代码的复用性、扩展性与灵活性。 专栏:【C++成长之旅】 一、多态的概念 多态(polymorphism)的概念:通俗来说,就是多种形态。 虚函数表是 C++ 实现运行时多态的核心机制。 我们也可以看出,虚表中存储的其实就是虚函数指针,所以虚表本质就是函数指针数组。 然后我们再来输入的看一下它是如何实现多态的。 这个问题严格说并没有标准答案C++标准并没有规定,我们写下面的代码可以对比验证一下。vs下是存在常量区的。 总结 多态让“同一接口”在“不同对象”上拥有“不同实现”,是让 C++ 面向对象思想真正落地的关键。

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

    C++多态

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

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

    C++多态

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

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

    C++多态

    前言 本篇博客我们来介绍多态知识的总结,这一部分面试官特别爱提问,也是我们需要注意的 个人主页:小张同学zkf ⏩ 文章专栏:C++ 若有问题 评论区见 欢迎大家点赞收藏⭐文章 1.多态的概念 2.多态的实现与定义 2.1多态的构成条件 多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了 Person。 ; 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
  • 来自专栏MasiMaro 的技术博文

    C++多态

    面向对象的程序设计的三大要素之一就是多态多态是指基类的指针指向不同的派生类,其行为不同。 多态的实现主要是通过虚函数和虚表来完成,虚表保存在对象的头四个字节,要调用虚函数必须存在对象,也就是说虚函数必须作为类的成员函数来使用。 { nNum = n; } private: int nNum; }; int main() { CVirtual cv; cv.setNumber(2) 总共占8个字节 0040128B call @ILT+25(CVirtual::CVirtual) (0040101e);调用构造函数 27: cv.setNumber(2) ; 00401290 push 2 00401292 lea ecx,[ebp-8] 00401295 call @ILT+0(CVirtual:

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

    C++多态

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

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

    C++多态

    = new B; delete p1; delete p2; return 0; } (delete的原理类似于先调用各自的析构函数,再去free) 这里调用析构函数实现了多态的效果,只有实现多态 2.多态如何实现 我们以刚才买票的例子来说明多态是如何实现的。 虚函数表的存储位置C++标准中没有规定,取决于不同编译器。在VS中,虚函数表是存储在常量区的。 下面这段代码可以验证下在VS中虚函数表是存储在常量区的。 什么是多态? 答:多态分为静态多态:函数重载;和动态多态:继承中的虚函数重写+基类指针引用。 2. 什么是重载、重写 ( 覆盖 ) 、重定义 ( 隐藏 ) ? 答:参考上述内容。 3. C++ 菱形继承的问题?虚继承的原理? 答:参考继承。注意这里不要把虚函数表和虚基表搞混了。 11. 什么是抽象类?抽象类的作用? 答:参考上述内容。

    47410编辑于 2024-11-26
  • 来自专栏转自CSDN

    C++ 多态

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

    40010编辑于 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
领券