多态分为两类
静态多态:函数重载和运算符重载属于静态多态
动态多条:派生类和虚函数实现运行时多态
静态多态和动态多态区别:
静态多态的函数地址早绑定-编译阶段确定函数地址
动态多态的函数地址晚绑定-运行阶段 确定函数地址
#include<iostream>
using namespace std;
#include<string>
class Animal
{
public:
//虚函数
virtual void speak()
{
cout<<"动物在说话"<<endl;
}
};
class Cat:public Animal
{
public:
//重写:函数返回值类型、函数名、参数列表完全相同
virtual void speak()//此处的virtual可写可不写
{
cout<<"小猫在说话"<<endl;
}
};
//地址早绑定, 在编译阶段确定函数地址
//若要让猫说话 ,那么这个函数地址就不能早绑定,需要在运行阶段进行绑定, 也就是地址晚绑定
//动态多态满足条件
//1.有继承关系
//2.子类重写父类的虚函数
//动态多态使用
//父类的指针或者引用 执行子类对象
void doSpeak(Animal &animal)
{
animal.speak();
}
void test01()
{
Cat cat;
doSpeak(cat);
}
void test02()
{
cout<<"sizeof Animal="<<sizeof(Animal)<<endl;
}
int main()
{
test02();
system("pause");
return 0;
}
多态实现计算器
#include<iostream>
using namespace std;
#include<string>
class Calculator
{
public:
int getResult(string oper)
{
if(oper=="+")
{
return m_Num1+m_Num2;
}
else if(oper=="-")
{
return m_Num1-m_Num2;
}
else if(oper=="*")
{
m_Num1*m_Num2;
}
}
int m_Num1;
int m_Num2;
};
void test01()
{
Calculator c;
c.m_Num1=10;
c.m_Num2=10;
cout<<c.m_Num1<<"+"<<c.m_Num2<<"="<<c.getResult("+")<<endl;
}
//利用多态实现计算器
//多态好处:
//1.组织结构清晰
//2.可读性强
//3.对于前期和后期扩展以及维护性高
//实现计算器抽象类
class AbstractCalculator
{
public:
virtual int getResult()
{
return 0;
}
int m_Num1;
int m_Num2;
};
//加法计算器类
class AddCalculator :public AbstractCalculator
{
public:
int getResult()
{
return m_Num1+m_Num2;
}
};
//减法计算器类
class SubCalculator :public AbstractCalculator
{
public:
int getResult()
{
return m_Num1-m_Num2;
}
};
//乘法计算器类
class MulCalculator :public AbstractCalculator
{
public:
int getResult()
{
return m_Num1*m_Num2;
}
};
void test02()
{
//多态使用条件
//父类指针或者引用指向子类对象
AbstractCalculator *abc=new AddCalculator;
abc->m_Num1=100;
abc->m_Num2=100;
cout<<abc->m_Num1<<"+"<<abc->m_Num2<<"="<<abc->getResult()<<endl;
delete abc; //用完后记得销毁
abc=new SubCalculator;
abc->m_Num1=100;
abc->m_Num2=100;
cout<<abc->m_Num1<<"-"<<abc->m_Num2<<"="<<abc->getResult()<<endl;
delete abc;
abc=new MulCalculator;
abc->m_Num1=100;
abc->m_Num2=100;
cout<<abc->m_Num1<<"*"<<abc->m_Num2<<"="<<abc->getResult()<<endl;
delete abc;
}
int main()
{
//test01();
test02();
}