0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是多态?

汽车电子技术 来源:C语言Plus 作者:Maye426 2023-02-27 15:58 次阅读

什么是多态?

父类指针即根据指向的不同对象,响应同一消息(函数调用),产生不同行为。

多态三要素?

1,继承

2,虚函数重写

3,父类指针(引用)指向子类对象

多态的实现很简答,让我们来看一段代码

#include
using namespace std;
class Parent
{
public:
  virtual void show()
{
    cout << "我是你爹" << endl;
  }
};
class Child:public Parent//1,继承
{
public:
  virtual void show()//2,虚函数重写
{
    cout << "我是你崽" << endl;
  }
};


int main()
{
  Parent *pa = new Child;//3,父类指针指向子类对象
  pa->show();


  getchar();
  return 0;
}
//结果输出的是子类的show函数--"我是你崽"

实现很简单,但是这又是什么原理呢?

当我们在类中声明了虚函数之后,编译器会给类添加一个vptr指针,当定义对象的时候,会把所有虚函数放入一个叫虚函数表的顺序表,然后用vptr指针指向虚函数表。当进行pa->show();调用的时候,C++编译器不需要区分子类或者父类对象,只需要在pa指针中,找到vptr指针即可。

如果对象类型是子类,就调用子类的函数;如果对象类型是父类,就调用父类的函数,(即指向父类调父类,指向子类调子类)此为多态的表现。

既然类里面有vptr指针,那么我们能找到它吗?

咱们一起来探究下:首先看下加了虚函数的类的大小有没有变化。

图片

可以看到加了虚函数,类的大小比没有增加虚函数的类,多了四个字节的空间,有的同学可能会说,四个字节的类型不一定是指针。不要着急,让我们继续往下看。

接下来我们定义对象,然后通过调试,看下局部变量窗口

图片

从这里就可以明确看到,子类对象中有一个vptr指针,而且它是对象的第一个成员,它的类型是void**,指向的是一个顺序表,下标为0的元素装的是我们声明的虚函数。

那么,知道了这些,咱们能利用对象找到虚函数表,然后自己手动调用虚函数吗?

你们:肯定可以啊,废话

我:。。。那就废话不多说,欧力给!搞起

我:首先画一张内存模型图,瞅瞅(画工太丑,见谅)

图片

1,首先,要拿到vptr指针,怎么拿呢?因为它在对象的第一个元素,所以我们先对对象取地址&ch,这样就拿到了对象的地址。对象的元素的内存是连续的,但是现在指针的步长是Child类的大小,我们需要把它当成一个整型数组(因为vptr是四个字节),所以需要强转成int*,即(int*)&ch,这样之后数组第一个元素就是vptr指针了,取值即可得到

(int )&ch

2,然后,前面通过调试我们知道了,vptr指针是void**类型的,所以我们也要讲它转为int*,然后取值. (int )( (int )&ch),这样就拿到了虚函数表的第一个元素。

3,但是,现在拿到的元素是int*型,不是函数指针,无法调用,所以我们需要强转为函数指针,才能进行调用。

图片

你学废了没?嘿嘿

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 指针
    +关注

    关注

    1

    文章

    473

    浏览量

    70364
  • 对象
    +关注

    关注

    1

    文章

    38

    浏览量

    17291
  • 函数调用
    +关注

    关注

    0

    文章

    19

    浏览量

    2558
收藏 人收藏

    评论

    相关推荐

    C++虚函数在多态中的运用

      直观的说,就是向不同的对象发送一个消息,不同的对象在接收消息以后有不同的行为;函数重载和运算符重载都是多态现象。
    发表于 10-25 17:32 340次阅读
    C++虚函数在<b class='flag-5'>多态</b>中的运用

    C++的多态详解

    在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。
    发表于 09-20 17:18 326次阅读

    多态VI例子

    多态VI例子,希望大家喜欢
    发表于 06-26 17:16

    【资料】多态子VI

    多态子VI,刚看到的,分享给大家,希望对新学者有帮助。。。。。。
    发表于 12-11 13:50

    多态子VI已断开,运行该VI前必须解决多态子VI的所有错误。

    多态子VI已断开,运行该VI前必须解决多态子VI的所有错误。外部连接了USB-4711的采集卡,等有正常显示;
    发表于 01-14 20:35

    请问多态的必要条件是什么?

    什么是多态多态的必要条件是什么?
    发表于 11-06 06:22

    如何完备地实现C++多态性?

    如何完备地实现C++多态性?虚函数怎么使用?
    发表于 04-28 06:44

    LabVIEW多态 VI (Polymorphic VIs)的使用

    LabVIEW多态 VI (Polymorphic VIs)的使用多态 VI (Polymorphic VIs) 是什么,什么时候可以使用它们?解答:多态 VI 最早是在 LabVIEW 6.0 被
    发表于 05-10 21:04

    基于Java多态性的应用程序设计

    Java 中的多态体现在类的继承和实现接口等方面。通过对与多态有关的概念进行归纳比较,从继承和接口两方面对多态的正确实现进行分析,结合实例说明多态性在程序设计中的
    发表于 09-09 08:51 24次下载

    什么是方法的重载(多态性)?

    什么是方法的重载(多态性)? 在同一个类中至少有两个方法用同一个名字,但有不同的参数。
    发表于 04-28 14:28 1224次阅读
    什么是方法的重载(<b class='flag-5'>多态</b>性)?

    C++的动态多态和静态多态

    多态是 C++ 中面向对象技术的核心机制之一包含静态多态和动态多态它们之间有一定的相似性但是应用范围不同该文论述了这种相似性并重点论述了以模板实现的静态多态的应用范围
    发表于 06-29 15:41 41次下载
    C++的动态<b class='flag-5'>多态</b>和静态<b class='flag-5'>多态</b>

    java多态性的实现

    Java中多态性的实现 什么是多态 面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。
    发表于 09-27 10:36 9次下载

    JAVA教程之消息、继承与多态的应用和资料介绍说明

    本文档的主要内容详细介绍的是JAVA教程之消息、继承与多态的应用和资料介绍说明主要内容包括了:1 消息,2 访问控制,3 多态机制 ,4 继承机制,5 抽象类、接口与包
    发表于 01-16 11:02 0次下载
    JAVA教程之消息、继承与<b class='flag-5'>多态</b>的应用和资料介绍说明

    Java中的多态有哪些表现形式

    学习Java语言的过程中,对于多态的理解是非常关键的,理解了多态也就意味着打开了理解Java各种“抽象”的大门。
    发表于 09-10 15:50 1857次阅读

    java的封装继承和多态

    继承是为了重用父类代码。两个类若存在IS-A的关系就可以使用继承。,同时继承也为实现多态做了铺垫。那么什么是多态呢?多态的实现机制又是什么?请看我一一为你揭开:
    发表于 10-15 10:05 1318次阅读
    java的封装继承和<b class='flag-5'>多态</b>