多态是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后 函数里面存在了一个虚函数指针)