在多态实现的大部分情况中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容
因此可以将虚函数改为纯虚函数
纯虚函数语法:virtual 返回值类型 函数名 (参数列表)= 0 ;
当类中有了纯虚函数,这个类也称为抽象类
抽象类特点

  • 无法实例化对象
  • 子类必须重写抽象类中的纯虚函数,否则也属于抽象类

虚函数没有实际函数,只依靠子类,只要有一个函数是纯虚函数,那么包含该纯虚函数的类就是抽象类。
子类在继承抽象类的时候,必须重写(vfptr重覆盖)函数,否则会被继承下来,变成纯虚函数,无法实例化对象。
拥有纯虚函数的类只能是父类,而且必须要得到继承。继承的类也必须重载这个函数,而且 = 0是一个纯说明符,不可更改。

  1. #include <iostream>
  2. using namespace std;
  3. class AbstractExample {
  4. public:
  5. virtual int func() = 0;
  6. int m_a = 1;
  7. int m_b = 1;
  8. };
  9. class Prints :public AbstractExample {
  10. public:
  11. int func() {
  12. return m_a + m_b;
  13. }
  14. };
  15. void example() {
  16. AbstractExample* abs = new Prints;
  17. cout << abs->func();
  18. delete abs;
  19. }
  20. int main() {
  21. example();
  22. return 0;
  23. }

而且所有继承抽象类的类必须进行重载。

案例

制作咖啡和茶

制作饮品

案例描述:
制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料
利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ryWrUSph-1599302023871)(assets/1545985945198.png)]
示例:

  1. //抽象制作饮品
  2. class AbstractDrinking {
  3. public:
  4. //烧水
  5. virtual void Boil() = 0;
  6. //冲泡
  7. virtual void Brew() = 0;
  8. //倒入杯中
  9. virtual void PourInCup() = 0;
  10. //加入辅料
  11. virtual void PutSomething() = 0;
  12. //规定流程
  13. void MakeDrink() {
  14. Boil();
  15. Brew();
  16. PourInCup();
  17. PutSomething();
  18. }
  19. };
  20. //制作咖啡
  21. class Coffee : public AbstractDrinking {
  22. public:
  23. //烧水
  24. virtual void Boil() {
  25. cout << "煮农夫山泉!" << endl;
  26. }
  27. //冲泡
  28. virtual void Brew() {
  29. cout << "冲泡咖啡!" << endl;
  30. }
  31. //倒入杯中
  32. virtual void PourInCup() {
  33. cout << "将咖啡倒入杯中!" << endl;
  34. }
  35. //加入辅料
  36. virtual void PutSomething() {
  37. cout << "加入牛奶!" << endl;
  38. }
  39. };
  40. //制作茶水
  41. class Tea : public AbstractDrinking {
  42. public:
  43. //烧水
  44. virtual void Boil() {
  45. cout << "煮自来水!" << endl;
  46. }
  47. //冲泡
  48. virtual void Brew() {
  49. cout << "冲泡茶叶!" << endl;
  50. }
  51. //倒入杯中
  52. virtual void PourInCup() {
  53. cout << "将茶水倒入杯中!" << endl;
  54. }
  55. //加入辅料
  56. virtual void PutSomething() {
  57. cout << "加入枸杞!" << endl;
  58. }
  59. };
  60. //业务函数
  61. void DoWork(AbstractDrinking* drink) {
  62. drink->MakeDrink();
  63. delete drink;
  64. }
  65. void test01() {
  66. DoWork(new Coffee);
  67. cout << "--------------" << endl;
  68. DoWork(new Tea);
  69. }
  70. int main() {
  71. test01();
  72. system("pause");
  73. return 0;
  74. }