多态是c++面向对象三大特性之一
    多态分为两类
    1静态多态:函数重载 和 运算符重载 属于静态多态,复用函数名
    2动态多态:派生类和虚函数实现运行时多态
    静态多态和动态多态区别:
    1静态多态的函数地址早绑定 - 编译阶段确定函数地址
    2动态多态的函数地址晚绑定 - 运行阶段确定函数地址
    多态的运行:
    运行时多态在虚函数的支持下实现的,他通过指针或引用调用该函数操作。
    下面通过案例进行讲解多态

    1. #include<iostream>
    2. using namespace std;
    3. //(虚基类)动物类
    4. class Animal
    5. {
    6. public:
    7. int m_Age=10;
    8. };
    9. //羊类
    10. class Sheep:virtual public Animal
    11. {
    12. public:
    13. // int m_Age=20;
    14. };
    15. //利用虚继承 解决菱形继承问题
    16. //继承之前 加上关键字 virtual 变为虚继承(即两个父类继承的数据是共享的)
    17. //Animal类称为 虚基类
    18. //驼类
    19. class Tuo:virtual public Animal
    20. {
    21. // int m_Age=30;
    22. };
    23. class SheepTuo:public Sheep,public Tuo
    24. {
    25. };
    26. void show()
    27. {
    28. SheepTuo p;
    29. p.Sheep::m_Age=18;
    30. p.Tuo::m_Age=20;
    31. //当菱形继承 两个父类拥有相同的数据时 需要加作用域用来区分。
    32. cout<<"sheep="<<p.Sheep::m_Age<<endl;
    33. cout<<"Tuo ="<<p.Tuo::m_Age<<endl;
    34. //菱形继承会导致数据有两份(即子类继承了两个父类的相同的数据) 造成资源浪费
    35. cout<<"SheepTuo="<<p.m_Age<<endl;
    36. }
    37. int main()
    38. {
    39. show();
    40. return 0;
    41. }

    原理解析图:

    image.png

    注释: 其中Animal类中的函数 若是没有加 virtual 则该类只占用1个内存空间。
    若是加了 virtual 则该类 占用4个内存空间。(原因时加了vartual后 函数里面存在了一个虚函数指针)