多态练习案例——计算器
案例描述:分别利用普通写法和多态技术,设计实现两个操作数进行运算的计算器类
多态的优点:
- 代码组织结构清晰;
- 可读性强;
- 利于前期和后期的维护及扩展
1. 普通写法
class Calculater
{
public:
int num1;
int num2;
int GetResualt(string op)
{
if (op == "+")
{
return num1 + num2;
}
if (op == "-")
{
return num1 - num2;
}
if (op == "*")
{
return num1 * num2;
}
}
};
void test47()
{
Calculater c1;
c1.num1 = 10;
c1.num2 = 20;
cout << "num1 + num2 = " << c1.GetResualt("+") << endl;
cout << "num1 - num2 = " << c1.GetResualt("-") << endl;
cout << "num1 * num2 = " << c1.GetResualt("*") << endl;
}
void main47()
{
test47();
system("pause");
}
//如果想扩展新功能,需要修改源码
//真正的开发过程中,提倡“开闭原则” 即:对扩展进行开发,对修改进行关闭。
2. 利用多态技术
//计算器抽象类
class Calculater2
{
public:
int num1;
int num2;
virtual int GetResualt()
{
return 0;
}
};
//加法计算器类
class AddCalculater : public Calculater2
{
public:
int GetResualt()
{
return num1 + num2;
}
};
//减法计算器类
class SubCalculater : public Calculater2
{
public:
int GetResualt()
{
return num1 - num2;
}
};
//乘法计算器类
class MulCalculater : public Calculater2
{
public:
int GetResualt()
{
return num1 * num2;
}
};
void test48()
{
//多态使用条件
//父类指针或者引用指向子类对象
//使用指针的方式:
//加法运算
Calculater2 *c1 = new AddCalculater;
c1->num1 = 20;
c1->num2 = 10;
cout << c1->num1 << "+" << c1->num2 << "=" << c1->GetResualt() << endl;
delete c1;//用完记得销毁。 销毁只是把堆区的数据释放掉了,但是c1的数据类型没有变,可以重新给c1赋值
//减法运算
c1 = new SubCalculater;
c1->num1 = 20;
c1->num2 = 10;
cout << c1->num1 << "-" << c1->num2 << "=" << c1->GetResualt() << endl;
delete c1;
//乘法运算
c1 = new MulCalculater;
c1->num1 = 20;
c1->num2 = 10;
cout << c1->num1 << "*" << c1->num2 << "=" << c1->GetResualt() << endl;
delete c1;
}
int main48()
{
test48();
system("pause");
return 0;
}
3. 自己扩展:将成员属性私有化
class Calculater3
{
private:
int num1;
int num2;
public:
virtual int GetResualt()
{
return 0;
}
void SetNum1(int a)
{
num1 = a;
}
void SetNum2(int b)
{
num2 = b;
}
int GetNum1()
{
return num1;
}
int GetNum2()
{
return num2;
}
};
//加法计算器类
class AddCalculater3 : public Calculater3
{
public:
int GetResualt()
{
return GetNum1() + GetNum2();
}
};
//减法计算器类
class SubCalculater3 : public Calculater3
{
public:
int GetResualt()
{
return GetNum1() - GetNum2();
}
};
//乘法计算器类
class MulCalculater3 : public Calculater3
{
public:
int GetResualt()
{
return GetNum1() * GetNum2();
}
};
void test49()
{
//多态使用条件
//父类指针或者引用指向子类对象
//使用指针的方式:
//加法运算
Calculater3* c1 = new AddCalculater3;
c1->SetNum1(20);
c1->SetNum2(10);
cout << c1->GetNum1() << "+" << c1->GetNum2() << "=" << c1->GetResualt() << endl;
delete c1;//用完记得销毁。 销毁只是把堆区的数据释放掉了,但是c1的数据类型没有变,可以重新给c1赋值
//减法运算
c1 = new SubCalculater3;
c1->SetNum1(200);
c1->SetNum2(100);
cout << c1->GetNum1() << "-" << c1->GetNum2() << "=" << c1->GetResualt() << endl;
delete c1;
//乘法运算
c1 = new MulCalculater3;
c1->SetNum1(10);
c1->SetNum2(10);
cout << c1->GetNum1() << "*" << c1->GetNum2() << "=" << c1->GetResualt() << endl;
delete c1;
}
int main49()
{
test49();
system("pause");
return 0;
}
(哔哩哔 哩黑马程序员 C++教程 学习笔记,如有侵权请联系删除)