C++Note 纯虚函数和抽象类 案例2:制作饮品

多态中,通常父类中虚函数的实现没有意义 主要都是调用子类重写的内容

因此可以将虚函数改为纯虚函数

纯虚函数语法:   

virtual 返回值类型 函数名 (参数列表) = 0;

当类中有了纯虚函数,这个类也称为抽象类

抽象类特点:

  无法实例化对象

  子类必须重写抽象类中的纯虚函数 否则也属于抽象类

案例:

制作饮品的大致流程为:  煮水  -  冲泡  倒入杯中  加入辅料

利用多态实现   提供抽象制作饮品基类  提供子类制作咖啡和茶叶

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 class AbstractDrinking//抽象类
 4 {
 5 public:
 6     //煮水
 7     virtual void Boil() = 0;//虚函数(纯虚函数子类必须重写),虚函数不用重写  virtual void Boil(){}
 8     //冲泡
 9     virtual void Brew() = 0;
10     //倒入杯中
11     virtual void PourInCup() = 0;
12     //加入辅助佐料
13     virtual void PutSomeThing() = 0;
14     //制作饮品
15     void makeDrink()
16     {
17         Boil();
18         Brew();
19         PourInCup();
20         PutSomeThing();
21     }
22 };
23 //制作咖啡
24 class Coffee:public AbstractDrinking
25 {
26 public:
27     //煮水
28     virtual void Boil()
29     {
30         cout << "煮水" << endl;
31     }
32     //冲泡
33     virtual void Brew()
34     {
35         cout << "冲泡茶叶" << endl;
36     }
37     //倒入杯中
38     virtual void PourInCup()
39     {
40         cout << "倒入杯中" << endl;
41     }
42     //加入辅助佐料
43     virtual void PutSomeThing()
44     {
45         cout << "加入柠檬" << endl;
46     }
47 };
48 class Tea :public AbstractDrinking
49 {
50 public:
51     virtual void Boil()
52     {
53         cout << "煮山泉水" << endl;
54     }
55     //冲泡
56     virtual void Brew()
57     {
58         cout << "冲泡咖啡" << endl;
59     }
60     //倒入杯中
61     virtual void PourInCup()
62     {
63         cout << "倒入杯中" << endl;
64     }
65     //加入辅助佐料
66     virtual void PutSomeThing()
67     {
68         cout << "加入牛奶和糖" << endl;
69     }
70 };
71 //制作饮品
72 void doWork(AbstractDrinking* abs)
73 {
74     abs->makeDrink();
75     delete abs;//堆区数据释放
76 }
77 void test()
78 {
79     //制作咖啡
80     doWork(new Coffee);
81     cout << "----------------" << endl;
82     doWork(new Tea);
83 }
84 int main()
85 {
86     test();
87     system("pause");
88     return 0;
89 }
复制代码

 

posted on   廿陆  阅读(9)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示