C++ 多态

C++多态

C++中的三个特性中封装实现了对于数据的安全以及管理,继承实现了对于逻辑的复用,而我们今天实现的多态就是实现了灵活性,多态故名思意就是多种形态,多态可以简单的概括为“一个接口,多种方法”根据对象的不同来调不同的函数,同时也体现了C++的面型对象特性。
多态分为静态多态和动态多态
静态多态:静态多态就是重载,在编译的时候决定,所以叫静态多态
动态多态:用虚函数实现,在运行的时候决定,被叫做动态多态
我们这一篇博客主要探讨动态多态,那么如何实现动态多态呢,上一篇博客我们提出了虚继承的概念,用到了virtual关键字,这里实现动态多态也要用到这个关键字
虚函数:类的成员函数前加virtual关键字,则这个函数是虚函数
虚函数重写:当子类定义了一个与父类完全的虚函数的时候,则叫做重写(覆盖)了父类的虚函数
下面这段代码来说明虚函数如何重写

#include<iostream>
#include<windows.h>
using namespace std;
class person
{
public:
 virtual void BuyTickets()
 {
  cout << "买票" << endl;
 }
};
class student :public person
{
 virtual void BuyTickets()
 {
  cout << "买半价票" << endl;
 }
};
void func(person& p)
{
 p.BuyTickets();
}
int main()
{
 person p;
 student s;
 func(p);
 func(s);
 system("pause");
 return 0;
}

在这段代码中我们可以看到,父类和子类中有相同的函数,但是函数是根据对象的不同进行调用的,至于这里的底层实现请看 预留
这篇博客深入探索C++模型,剖析了实现多态的底层原理
我们根据监视窗口来简单看看如何实现
在这里插入图片描述
这里我们可以看出,p和s中有两个vfptr指针,这个指针指向虚函数表,而虚函数表里边存放的指针就指向我们刚刚定义的虚函数,所以当我们通过对象调用相同的函数的时候进入虚函数表找有没有这个函数,有的话就调用虚函数表中的函数,实现通过对象调用函数。
构成多态的四大条件: (缺一不可)
1.不在同一作用域(分别在父类和子类)
2.函数名相等/参数相等/返回值相同/(协变除外)
3.基类函数必须有virtual关键字
4.访问修饰符可以不同
那么重写的对象模型是怎样的呢,我们通过下图理解
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值