C++多态案例-设计计算器类

1.前置知识点

多态是面向对象的三大特性之一
多态分为两类

  • 静态多态:函数重载运算符重载都属于静态多态,复用函数名
  • 动态多态:派生类虚函数实现运行时多态

静态多态和动态多态的区别

  • 静态多态的函数地址早绑定-----编译阶段确定函数地址
  • 动态多态的函数地址晚绑定-----运行阶段确定函数地址

动态多态必须满足的条件

  1. 有继承关系
  2. 子类重写父类的虚函数

1.1多态使用:

父类指针或者引用指向子类对象

1.2 重写概念

重写:函数名 参数列表 函数返回值类型 完全一致

1.3 多态的好处

  • 1.组织结构清晰
  • 2.可读性比较强
  • 3.对于前期和后期的扩展和维护性比较高

1.4 测试案例

1.4.1 静态多态的函数地址早绑定-----编译阶段确定函数地址

#include
using namespace std;

//子类可以转父类,父类不能转子类
//动物类
class Animal {

public:
	 void speak()
	{
	
		cout << "动物在说话" << endl;
	
	}

};


//猫类
class Cat :public Animal {
public:
	void speak()
	{
		cout << "猫在说话" << endl;
	}

};

//执行说话的函数
//地址早绑定,在编译阶段就确定了函数地址
void doSpeak(Animal &animal)//Animal &animal=cat
{

	animal.speak();

}


void test01()
{
	Cat cat;
	doSpeak(cat);



}





//分别利用普通写法和多态技术实现计算器
//普通写法class Calculator
int main()
{

	test01();


	system("pause");
	return 0;


}

1.4.2动态多态的函数地址晚绑定-----运行阶段确定函数地址

#include
using namespace std;

//子类可以转父类,父类不能转子类
//动物类
class Animal {

public:
	virtual void speak()
	{
	
		cout << "动物在说话" << endl;
	
	}

};


//猫类
class Cat :public Animal {
public:
	void speak()
	{
		cout << "猫在说话" << endl;
	}

};

//执行说话的函数
//地址早绑定,在编译阶段就确定了函数地址
void doSpeak(Animal &animal)//Animal &animal=cat
{

	animal.speak();

}


void test01()
{
	Cat cat;
	doSpeak(cat);



}





//分别利用普通写法和多态技术实现计算器
//普通写法class Calculator
int main()
{

	test01();


	system("pause");
	return 0;


}

结果

C++多态案例-设计计算器类_第1张图片

2. 设计实现两个操作数进行运算的计算器类

案例描述:
分别利用普通写法和多态技术,设计实现两个操作数进行运算的计算器类
多态的优点:

  • 代码组织结构清晰
  • 可读性强
  • 利于前期和后期的扩展以及维护

对比传统写法和使用多态

  • 在真实开发中,提倡开闭原则
  • 开闭原则:对扩展进行开放,对修改进行关闭

2.1传统写法

#include
#include
using namespace std;

//子类可以转父类,父类不能转子类
//动物类
//class Animal {
//
//public:
//	virtual void speak()
//	{
//	
//		cout << "动物在说话" << endl;
//	
//	}
//
//};
//
//
猫类
//class Cat :public Animal {
//public:
//	virtual void speak()
//	{
//		cout << "猫在说话" << endl;
//	}
//
//};
//
执行说话的函数
地址早绑定,在编译阶段就确定了函数地址
//void doSpeak(Animal &animal)//Animal &animal=cat
//{
//
//	animal.speak();
//
//}
//
//
//void test01()
//{
//	Cat cat;
//	doSpeak(cat);
//
//
//
//}

//多态的好处
//1.组织结构清晰
//2.可读性比较强
//3.对于前期和后期的扩展和维护性比较高



//分别利用普通写法和多态技术实现计算器
//普通写法class Calculator---不利于维护
class Calculator
{
	//实现两个操作数运算
public:
	int getResult(string opt)//传入操作符
	{

		if (opt == "+")
		{
			return m_Num1 + m_Num2;
		}

		else if (opt == "-")
		{
			return m_Num1 - m_Num2;

		}

		else if (opt == "*")
		{
			return m_Num1 * m_Num2;

		}

	}


	int  m_Num1;
	int  m_Num2;



};

//测试案例


void test01()
{
	//创建计算器对象
	Calculator c;
	c.m_Num1 = 10;
	c.m_Num2 = 20;

	cout << c.m_Num1 << "+" << c.m_Num2 <<"="<< c.getResult("+") << endl;


}


int main()
{
	test01();



	system("pause");
	return 0;


}

2.2 使用多态实现计算器类

#include
#include
using namespace std;

//子类可以转父类,父类不能转子类
//动物类
//class Animal {
//
//public:
//	virtual void speak()
//	{
//	
//		cout << "动物在说话" << endl;
//	
//	}
//
//};
//
//
猫类
//class Cat :public Animal {
//public:
//	virtual void speak()
//	{
//		cout << "猫在说话" << endl;
//	}
//
//};
//
执行说话的函数
地址早绑定,在编译阶段就确定了函数地址
//void doSpeak(Animal &animal)//Animal &animal=cat
//{
//
//	animal.speak();
//
//}
//
//
//void test01()
//{
//	Cat cat;
//	doSpeak(cat);
//
//
//
//}

//多态的好处
//1.组织结构清晰
//2.可读性比较强
//3.对于前期和后期的扩展和维护性比较高



//分别利用普通写法和多态技术实现计算器
//普通写法class Calculator
class Calculator
{
	//实现两个操作数运算
public:
	int getResult(string opt)//传入操作符
	{

		if (opt == "+")
		{
			return m_Num1 + m_Num2;
		}

		else if (opt == "-")
		{
			return m_Num1 - m_Num2;

		}

		else if (opt == "*")
		{
			return m_Num1 * m_Num2;

		}

		return -1;

	}


	int  m_Num1;
	int  m_Num2;



};

//测试案例

void test01()
{
	//创建计算器对象
	Calculator c;
	c.m_Num1 = 10;
	c.m_Num2 = 20;

	cout << c.m_Num1 << "+" << c.m_Num2 << "=" << c.getResult("+") << endl;


}


//利用多态实现计算器
//实现计算器抽象类
class AbstractCalculator {

public:
	int m_Num1;
	int m_Num2;

	virtual int getResult()//在父类虚函数中不实现任何功能
	{
		return 0;


	}


};


//设计加法计算器类
class AddCalculator :public AbstractCalculator
{


public:
	virtual int getResult()//在父类虚函数中不实现任何功能
	{
		return m_Num1 + m_Num2;


	}

};
//设计减法计算器类

class SubCalculator :public AbstractCalculator
{


public:
	virtual int getResult()//在父类虚函数中不实现任何功能
	{
		return m_Num1 - m_Num2;


	}

};


//设计乘法计算器类
class MultCalculator :public AbstractCalculator
{


public:
	virtual int getResult()//在父类虚函数中不实现任何功能
	{
		return m_Num1 * m_Num2;


	}

};



void test02()
{

	//多态使用条件
	//父类指针或者引用指向子类的对象


	//1.加法运算
	AbstractCalculator *ptr = new AddCalculator;//C++无参构造可以省略()
	ptr->m_Num1 = 10;
	ptr->m_Num2 = 200;

	cout << ptr->m_Num1 << "+" << ptr->m_Num2 << "=" << ptr->getResult() << endl;

	delete ptr;//释放堆区数据

	//2.减法运算
	ptr = new SubCalculator;
	ptr->m_Num1 = 10;
	ptr->m_Num2 = 200;

	cout << ptr->m_Num1 << "-" << ptr->m_Num2 << "=" << ptr->getResult() << endl;

	delete ptr;//释放数据
    
			  
	//3.乘法运算
	ptr = new  MultCalculator;
	ptr->m_Num1 = 100;
	ptr->m_Num2 = 200;

	cout << ptr->m_Num1 << "*" << ptr->m_Num2 << "=" << ptr->getResult() << endl;

	delete ptr;//释放数据


}

int main()
{
	//test01();
	test02();


	system("pause");
	return 0;


}

结果

C++多态案例-设计计算器类_第2张图片

你可能感兴趣的:(C++笔记,c++)