多态是c++面向对象三大特性之一
多态分为两类
1静态多态:函数重载 和 运算符重载 属于静态多态,复用函数名
2动态多态:派生类和虚函数实现运行时多态
静态多态和动态多态区别:
1静态多态的函数地址早绑定 - 编译阶段确定函数地址
2动态多态的函数地址晚绑定 - 运行阶段确定函数地址
多态的运行:
运行时多态在虚函数的支持下实现的,他通过指针或引用调用该函数操作。
下面通过案例进行讲解多态
#include<iostream>using namespace std;//(虚基类)动物类class Animal{public:int m_Age=10;};//羊类class Sheep:virtual public Animal{public:// int m_Age=20;};//利用虚继承 解决菱形继承问题//继承之前 加上关键字 virtual 变为虚继承(即两个父类继承的数据是共享的)//Animal类称为 虚基类//驼类class Tuo:virtual public Animal{// int m_Age=30;};class SheepTuo:public Sheep,public Tuo{};void show(){SheepTuo p;p.Sheep::m_Age=18;p.Tuo::m_Age=20;//当菱形继承 两个父类拥有相同的数据时 需要加作用域用来区分。cout<<"sheep="<<p.Sheep::m_Age<<endl;cout<<"Tuo ="<<p.Tuo::m_Age<<endl;//菱形继承会导致数据有两份(即子类继承了两个父类的相同的数据) 造成资源浪费cout<<"SheepTuo="<<p.m_Age<<endl;}int main(){show();return 0;}
原理解析图:

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