现在基本上知道了什么是多态,接着我们来一个例子使用多态和不使用多态来实现一个小功能的对比。感受下使用多态带来的便利。
1.非多态方式实现计算器
这里计算器我们就简单描述成两个数的相加,相减和相乘。
#include <iostream>
#include <string>
using namespace std;
class Calculator
{
public:
int m_Num1;
int m_Num2;
int getResult(string ope)
{
if (ope == "+")
{
return m_Num1 + m_Num2;
}
else if (ope == "-")
{
return m_Num1 - m_Num2;
}
else if (ope == "*")
{
return m_Num1 * m_Num2;
}
}
};
void test02()
{
//创建一个计算器对象
Calculator cal;
cal.m_Num1 = 20;
cal.m_Num2 = 10;
cout << cal.m_Num1 << "+" << cal.m_Num2 << "=" << cal.getResult("+") << endl;
cout << cal.m_Num1 << "-" << cal.m_Num2 << "=" << cal.getResult("-") << endl;
cout << cal.m_Num1 << "*" << cal.m_Num2 << "=" << cal.getResult("*") << endl;
}
int main()
{
test02();
system("pause");
}
运行结果
基本上实现一个计算器功能,但是这个有很大的缺点,那就是如果想增加两个数相除,两个数求平均数,我们都需要增加一个if else判断,这个是很痛苦的事情。
2.使用多态方式实现计算器
这里看看使用多态怎么实现计算器,而且代码可读性更强。思路是这样,我们先定义的一个抽象的计算器类,里面有两个int成员变量和一个getResult的方法。然后我们对于加法,我们新建一个加法的类,继承这个抽象计算器类,在加法子类中实现相加的返回,同理,新创建加法类和乘法类来实现相应的计算功能。
#include <iostream>
#include <string>
using namespace std;
class AbstractCalculator
{
public:
int m_Num1;
int m_Num2;
virtual int getResult()
{
return 0;
}
};
//加法类
class AddCalculator : public AbstractCalculator
{
virtual int getResult()
{
return m_Num1 + m_Num2;
}
};
//加法类
class SubCalculator : public AbstractCalculator
{
virtual int getResult()
{
return m_Num1 - m_Num2;
}
};
//乘法类
class MulCalculator : public AbstractCalculator
{
virtual int getResult()
{
return m_Num1 * m_Num2;
}
};
void test02()
{
//动态多态使用
AbstractCalculator * abc = new AddCalculator; //父类指针指向子类对象
//加法
abc->m_Num1 = 20;
abc->m_Num2 = 10;
cout << abc->m_Num1 << "+" << abc->m_Num2 << " = " << abc->getResult() << endl;
//用完记得删除
delete abc;
//减法
abc = new SubCalculator;
abc->m_Num1 = 10;
abc->m_Num2 = 10;
cout << abc->m_Num1 << "-" << abc->m_Num2 << " = " << abc->getResult() << endl;
delete abc;
//乘法
abc = new MulCalculator;
abc->m_Num1 = 10;
abc->m_Num2 = 10;
cout << abc->m_Num1 << "*" << abc->m_Num2 << " = " << abc->getResult() << endl;
delete abc;
}
int main()
{
test02();
system("pause");
}
上面用到了动态多态第二种使用情况,就是使用父类的指针指向子类对象。第二点需要注意,前后创建了一个父类对象指针abc,每次用完记得删除。不然不同计算都需要创建一次父类对象,太耗费内存。
运行结果
多态带来的好处
1)组织结构清晰
2)代码可读性强
3)对于前期拓展和后期维护性高