多态

1、多态

1、什么是多态
一种调用函数有多种不同的表现形态。

2、
封装:对信息进行隐藏,对外提供访问限制
继承:代码复用
多态:功能扩展–>在不改变原有代码的基础上进行添加

3、
确认实际调用的函数
1、看指针类型---->Animal *
2、看函数类型---->虚函数virtual void eat()
3、看pa指向对象的函数—>调用pa指向对象的函数 —>程序运行阶段才知道具体调用的执行语句动态联编(晚期绑定)
1、看指针类型---->Animal *
2、看函数类型---->普通函数 void sleep()
3、调用指针类型的函数—>Animal::sleep() —>程序运行前知道具体调用的函数静态联编(早期联编)
4、函数重写---->对虚函数的重定义
函数重定义—>在派生类中函数原型与基类中的函数原型相同的函数

#include <iostream>

using namespace std;

//封装:对信息进行隐藏,对外提供访问限制
//继承:代码复用
//多态:功能扩展-->在不改变原有代码的基础上进行添加

class Animal
{
public:
    virtual void eat()          //虚函数--->在函数前面加上virtual
    {
        cout<<"动物吃"<<endl;
    }
    void sleep()
    {
        cout<<"动物睡"<<endl;
    }
};

class Cat:public Animal
{
public:
    void eat()          //函数重写---->对虚函数的重定义
    {
        cout<<"猫吃鱼"<<endl;
    }
    void sleep()        //函数重定义--->在派生类中函数原型与基类中的函数原型相同的函数
    {
        cout<<"猫睡在沙发上"<<endl;
    }
};

class Dog:public Animal
{
public:
    void eat()          //函数重写---->对虚函数的重定义
    {
        cout<<"狗吃骨头"<<endl;
    }
    void sleep()
    {
        cout<<"狗睡在门口"<<endl;
    }
};

void func(Animal *pa)
{
    //确认实际调用的函数
    //1、看指针类型---->Animal *
    //2、看函数类型---->虚函数virtual void eat()
    //3、看pa指向对象的函数--->调用pa指向对象的函数 --->程序运行阶段才知道具体调用的执行语句动态联编(晚期绑定)
    pa->eat();

    //1、看指针类型---->Animal *
    //2、看函数类型---->普通函数 void sleep()
    //3、调用指针类型的函数--->Animal::sleep() --->程序运行前知道具体调用的函数静态联编(早期联编)
    pa->sleep();
}

int main1()
{
    Animal a;
    Cat c;
    Dog d;

    func(&a);
    cout<<"--------------"<<endl;
    func(&c);
    cout<<"--------------"<<endl;
    func(&d);
    cout<<"--------------"<<endl;


    return 0;
}

int main()
{

    return 0;
}

2、多态实现

1、虚函数指针是分部初始化的,执行到哪个构造函数,就指向哪个构造函数表
2、可以在将函数都设为虚函数,但是效率太低,每次都要从虚函数表中查找,不建议
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值