[C++]——多态、虚函数、虚指针

多态

什么是多态?

对不同类型的实体提供统一接口的一种方式称之为多态。

为什么要使用多态?

举个例子(例1):
在这里插入图片描述
这就是没有使用多态的效果,我们是想通过改变函数形参想要调用不同类中的实现函数,但是改变形参后,调用的仍然是Animal类型中的实现函数。
要解决这一问题就要使用多态对类的实现加以修饰。

多态的条件

  1. 父类有虚函数。
    virtual 函数返回类型 [函数名]
    {
    //实现内容;
    }
  2. 子类重写虚函数。
    要求:子类重写函数的返回值,参数,名称与父类中虚函数一致。
  3. 在主函数中用指针或引用调用虚函数。

了解的多态的实现条件,那我们将例1加以改进,观察多态带来的不同实现效果。
在这里插入图片描述
使用多态与未使用多态的结果对比:
在这里插入图片描述

虚函数

在探究虚函数本质之前,让我们先来观察一个现象
在这里插入图片描述
因为虚指针的存在,导致运行后的结果都比预期推断的结果要大出四个字节,虚指针是多态实现的关键。

虚指针

一旦有了虚函数,则会隐藏插入一个大小为4字节(32位下)的指针(__vfptr),即虚指针,一个类中无论有多少虚函数,都只有一个虚指针。
虚指针默认位于实例化对象的第一位,如下图:

__vfptr
私有数据成员1
私有数据成员2
私有数据成员n

虚指针的本质

虚指针的本质是指向一张虚表,这张虚表上存放着虚函数的地址,当子类重写父类虚函数时,子类虚函数地址会覆盖父类虚函数地址,即可实现多态。
图示:
在这里插入图片描述
注意:

  1. 构造函数不能为虚函数
  2. 不同的类中具有不同的虚指针
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值