目录

类和对象多态案例2制作饮品

类和对象—多态—案例2—制作饮品

案例描述:

制作饮品的大致流程为:煮水-冲泡-倒入杯中-加入辅料
利用多态技术实现本案例,提供抽象制作产品基类,提供子类制作咖啡和茶叶

https://i-blog.csdnimg.cn/direct/25e1a5a4e720472ba8d1c15b5945d44b.png

思路解析:

1. 定义抽象基类
  • 创建 AbstractDrinking 抽象类,该类定义了制作饮品的通用接口。

  • 包含四个纯虚函数:Boil()(煮水)、Brew()(冲泡)、PourInCup()(倒入杯中)和 PutSomething()(加入辅料),这些函数需要在派生类中具体实现。

  • 提供一个 makeDrink() 成员函数,该函数按顺序调用上述四个纯虚函数,定义了制作饮品的通用流程。

2. 定义具体饮品类
  • 定义 Coffee 类,继承自 AbstractDrinking 抽象类。

  • 实现 Boil()Brew()PourInCup()PutSomething() 四个纯虚函数,具体描述制作咖啡的步骤,如煮开水、冲泡咖啡、倒入杯中、加入糖和牛奶。

  • 定义 Tee 类(可能拼写有误,应为 Tea),同样继承自 AbstractDrinking 抽象类。

  • 实现 Boil()Brew()PourInCup()PutSomething() 四个纯虚函数,具体描述制作茶的步骤,如煮开水、冲泡茶叶、倒入杯中、加入柠檬。

3. 定义工作函数
  • 定义 doWork() 函数,该函数接受一个指向 AbstractDrinking 类的指针作为参数。

  • 在函数内部调用 makeDrink() 函数制作饮品。

  • 使用 delete 释放动态分配的内存,避免内存泄漏。

4. 定义测试函数
  • 定义 test01() 函数,用于测试制作咖啡和茶的功能。

  • 调用 doWork() 函数制作咖啡,并在制作完成后输出分隔线。

  • 再次调用 doWork() 函数制作茶。

5. 主函数
  • main() 函数中调用 test01() 函数,启动测试流程。

  • 返回 0 表示程序正常结束。 通过这种设计,代码实现了制作不同饮品的通用流程,同时利用多态性可以根据传入的具体饮品对象执行相应的制作步骤。

代码实现:

#include<iostream>
using namespace std; 

class AbstractDrinking{
	
public:
	
	//煮水 
	virtual void Boil() = 0;
	
	//冲泡 
	virtual void Brew() = 0;
	
	//倒入杯中
	virtual void PourInCup() = 0;
	
	//加入辅料
	virtual void PutSomething() = 0; 
	
	//制作饮品
	void makeDrink(){
		
		Boil();
		Brew();
		PourInCup();
		PutSomething(); 
	} 
};

class Coffee :public AbstractDrinking{
	
public:
	 
	 //煮水
	virtual void Boil(){
	 	
	 	cout << "煮开水" << endl;
	 } 
	 
	 //加入辅料
	virtual void Brew(){
	 	
	 	cout << "冲泡咖啡" << endl;
	 } 

	 //倒入杯中 
	virtual void PourInCup(){
	 	
	 	cout << "倒入杯中" << endl;
	 } 
	 
	 //加入辅料
	virtual void PutSomething(){
	 	
	 	cout << "加入糖和牛奶" << endl;
	 } 
};

class Tee :public AbstractDrinking{
	
public:
	 
	 //煮水
	virtual void Boil(){
	 	
	 	cout << "煮开水" << endl;
	 } 
	 
	 //加入辅料
	virtual void Brew(){
	 	
	 	cout << "冲泡茶叶" << endl;
	 } 

	 //倒入杯中 
	virtual void PourInCup(){
	 	
	 	cout << "倒入杯中" << endl;
	 } 
	 
	 //加入辅料
	virtual void PutSomething(){
	 	
	 	cout << "加入柠檬" << endl;
	 } 
};

void doWork(AbstractDrinking * abs){
	
	abs->makeDrink();
	delete abs;
}

void test01(){
	
	doWork(new Coffee);
	
	cout << "-----------------" << endl;
	
	doWork(new Tee);
}

int main(){
	
	test01();
	
	return 0;
} 

https://i-blog.csdnimg.cn/direct/637342ed13bc431a9bbaa83fa44c5513.png