22-【每天亿点点C++,简单又有趣儿】多态 ----- 这是自由的感觉

/*多态

静态多态:函数重载、运算符重载
动态多态:虚函数

区别:
函数早绑定、晚绑定
*/
#include<iostream>
#include<string>
using namespace std;


/*动态多态 - 虚函数*/
class AnimalCute // 父
{
public:
    //void speak()
    virtual void speak() // 虚函数
    {
        cout << "动物在说话" << endl;
    }

};
class Cat :public AnimalCute
{
public:
    void speak()
    {
        cout << "小猫在说话" << endl;
    }
};
class Dog :public AnimalCute
{
public:
    void speak()
    {
        cout << "小狗在说话" << endl;
    }
};
// 地址早绑定,在编译阶段确定函数地址
// 如果要想猫说话,就得地址晚绑定-->虚函数
void doSpeak(AnimalCute &animal) //AnimalCute & animal = cat;强制类型转化
{
    animal.speak();
}
void test_33()
{
    Cat cat;
    doSpeak(cat);
    Dog dog;
    doSpeak(dog);
}





/*多态的底层原理*/

void test_34()
{
    // size of animal 1 函数
    // size of animal 4 虚函数
    // vfptr  虚函数(表)指针
    // v  - virtual
    // f  - function
    // ptr- pointer

    // vftable 虚函数表
    cout << "size of animal " << sizeof(AnimalCute);
}








int main()
{
    // 动态多态满足条件:
    // -> 继承关系
    // -> 子类要重写父类的虚函数
    //
    // 注意:
    //   重载:函数名称相同、参数不同
    //   重写:函数名参数完全相同
    // 使用:
    //   父类的指针或引用去指向子类对象
    test_33();/*动态多态 - 虚函数*/
    test_34();

}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/magic_shuang/article/details/107591596
今日推荐