c++多态的基本概念

多态是c++面向对象三大特性之一(封装、继承、多态)
分为静态多态和动态多态
静态多态:函数重载和运算符重载就属于静态多态,重用函数名
动态多态:派生类和虚函数实现运行时的多态
区别:
静态多态函数地址早绑定,在编译阶段就确定
动态多态函数地址晚绑定,在运行阶段才确定
利用代码实现如下:

#include <iostream>
using namespace std;

class Animal
{
    public:

   virtual void speak() //动态多态的使用条件:1、要有继承关系,
       //子类要重写父类的虚函数,注意是重写不是重载,需要返回值类型、函数名、参数列表完全一致!
    {
        cout<<"动物在说话 !"<<endl;
    }
};

class Cat:public Animal
{
        public:
    void speak()    //重写了父类的虚函数,此时子类speak函数的virtual可加可不加
    {
        cout<<"小猫在说话!"<<endl;
    }
};

class Dog:public Animal
{
        public:
    void speak()
    {
        cout<<"小狗在说话!"<<endl;
    }
};

//此时输出的是动物在说话,虽然输入的参数是cat,但是由于我们是以animal作为形参,
//始终会调用animal的speak函数,相当于在编译阶段就确定了函数地址,属于早绑定
void dospeak(Animal &animal)
      //动态多态的使用,父类的指针或引用指向子类的对象
      //相当于是Animal &animal=cat;是一个父类的引用去指向子类的对象,而且可以调用speak函数
      //c++中是允许父子类型之间的转换的,不需要强制转换,可以直接使用
{
    animal.speak();
}

void test01() //如何实现调用猫的speak函数呢,就需要用到动态多态,使地址晚绑定,在运行阶段才绑定
             //在animal类的speak函数前加关键字virtual,使之变为虚函数即可
{        //此时的speak函数就是不确定的,需要根据传入的参数来确定调用哪个函数,在运行时才确定
    Cat cat;
    dospeak(cat);

     Dog dog;
     dospeak(dog);

}
void test02()
{
    cout<<"size of  Animal: "<<sizeof(Animal)<<endl;
}

int main()
{
    test01();
    cout<<endl;
    test02();
    return 0;
}

 剖析一下原理!!!!!!!!!!!!!!!
当我没用虚函数的时候,Animal类的大小是1,用了之后是8,本质上是函数结构发生了改变,
多了一个vfptr,(虚函数(表)指针),指向的是一个vftable(虚函数表),表里存放的是Animal类的speak函数的地址,(&Animal::speak)
当子类继承父类时,也会继承这一切,如果子类重写了父类的虚函数,那么虚函数表里的子类的speak函数地址将覆盖父类的speak函数地址
此时就实现了用父类的指针或引用去指向子类对象,调用的就是子类的speak函数了

此处的原理如果大家还不清楚建议去看看黑马讲的,很清楚,图我放着了:

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值