案例描述:
分别利用普通写法和多态技术,设计实现两个操作数进行运算的计算器类
多态的优点:
- 代码组织结构清晰
- 可读性强
- 利于前期和后期的扩展以及维护
普通写法
#include<iostream>
#include<string>
using namespace std;
//计算器实现两个数加减乘除
class calculate
{
public:
int calculater(string symbol)
{
if (symbol == "+")
{
return num1 + num2;
}
if (symbol == "-")
{
return num1 - num2;
}
if (symbol == "*")
{
return num1 * num2;
}
if (symbol == "/")
{
return num1 / num2;
}
}
public:
int num1;
int num2;
string symbol;
};
void main()
{
calculate ca;
ca.num1 = 10;
ca.num2 = 5;
cout << "加法" << ca.calculater("+") << endl;
cout << "减法" << ca.calculater("-") << endl;
cout << "乘法" << ca.calculater("*") << endl;
cout << "除法" << ca.calculater("/") << endl;
}
多态写法
/*
发生多态的三个条件
1、有继承关系
2、子类重写父类中的虚函数
3、父类的引用或指针指向子类对象
*/
#include<iostream>
#include<string>
using namespace std;
/*多态写法实现计算器*/
class calculator//父类计算器
{
public:
virtual int GetResult()//虚函数(子类会重写父类中的虚函数)
{
return 0;
}
public:
int num1, num2;
};
class add :public calculator//加法
{
public:
int GetResult()
{
return num1 + num2;
}
};
class sub :public calculator//减法
{
public:
int GetResult()
{
return num1 - num2;
}
};
class mul :public calculator//乘法
{
public:
int GetResult()
{
return num1 * num2;
}
};
class divi:public calculator //再增加一个除法,方便扩展
{
public:
int GetResult()
{
return num1 / num2;
}
};
int function(calculator& cal)
{
return cal.GetResult();//父类的引用指向子类对象
}
void main()
{
/*多态发生有两种方式*/
//1、父类的引用指向子类对象
cout << "引用方式" << endl;
add ADD;
ADD.calculator::num1 = 10;
ADD.calculator::num2 = 10;
cout << "加法:" << function(ADD) << endl;
sub SUB;
SUB.calculator::num1 = 10;
SUB.calculator::num2 = 10;
cout << "减法:" << function(SUB) << endl;
mul MUL;
MUL.calculator::num1 = 10;
MUL.calculator::num2 = 10;
cout << "乘法:" << function(MUL) << endl;
//1、父类的指针指向子类对象
cout << "指针方式" << endl;
calculator* cal = new add;
cal->num1 = 10;
cal->num2 = 10;
cout << "加法:" << cal->GetResult() << endl;
delete cal;//用完了记得销毁
cal = new sub;
cal->num1 = 10;
cal->num2 = 10;
cout << "减法:" << cal->GetResult() << endl;
delete cal;
cal = new mul;
cal->num1 = 10;
cal->num2 = 10;
cout << "乘法:" << cal->GetResult() << endl;
delete cal;
cal = new divi;
cal->num1 = 10;
cal->num2 = 10;
cout << "除法:" << cal->GetResult() << endl;
delete cal;
}