C++多态纯虚函数和抽象类与多态案例(二)

简介: 纯虚函数和抽象类在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容因此可以将虚函数改为纯虚函数纯虚函数语法:virtual 返回值类型 函数名 (参数列表)= 0 ;当类中有了纯虚函数,这个类也称为==抽象类==抽象类特点:• 无法实例化对象• 子类必须重写抽象类中的纯虚函数,否则也属于抽象类



纯虚函数和抽象类

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

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

纯虚函数语法:virtual 返回值类型 函数名 (参数列表)= 0 ;

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

抽象类特点

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

示例:

classBase

{

public:

   //纯虚函数

   //类中只要有一个纯虚函数就称为抽象类

   

   //抽象类特点:

   //抽象类无法实例化对象

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

   virtualvoidfunc() =0;

};

classSon :publicBase

{

public:

   virtualvoidfunc() //子类必须重写父类中的纯虚函数,否则子类无法实例化对象。

   {

       cout<<"func调用"<<endl;

   };

};

voidtest01()

{

   Base*base=NULL;

   //base b; // 错误,抽象类无法实例化对象

   //base = new Base; // 错误,抽象类无法实例化对象

   base=newSon;

   base->func();

   deletebase;//记得销毁

}

intmain() {

   test01();

   system("pause");

   return0;

}

写虚函数和纯虚函数就是想用多态,目的就是想让子类重写父类中的虚函数。

4.7.4 多态案例二-制作饮品

案例描述:

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

利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶

示例:

#include<iostream>

usingnamespacestd;

//抽象制作饮品

classAbstractDrinking {

public:

   //烧水

   virtualvoidBoil() =0;

   //冲泡

   virtualvoidBrew() =0;

   //倒入杯中

   virtualvoidPourInCup() =0;

   //加入辅料

   virtualvoidPutSomething() =0;

   //规定流程

   voidMakeDrink() {

       Boil();

       Brew();

       PourInCup();

       PutSomething();

   }

};

//制作咖啡

classCoffee : publicAbstractDrinking {

public:

   //烧水

   virtualvoidBoil() {

       cout<<"煮农夫山泉!"<<endl;

   }

   //冲泡

   virtualvoidBrew() {

       cout<<"冲泡咖啡!"<<endl;

   }

   //倒入杯中

   virtualvoidPourInCup() {

       cout<<"将咖啡倒入杯中!"<<endl;

   }

   //加入辅料

   virtualvoidPutSomething() {

       cout<<"加入牛奶!"<<endl;

   }

};

//制作茶水

classTea : publicAbstractDrinking {

public:

   //烧水

   virtualvoidBoil() {

       cout<<"煮自来水!"<<endl;

   }

   //冲泡

   virtualvoidBrew() {

       cout<<"冲泡茶叶!"<<endl;

   }

   //倒入杯中

   virtualvoidPourInCup() {

       cout<<"将茶水倒入杯中!"<<endl;

   }

   //加入辅料

   virtualvoidPutSomething() {

       cout<<"加入枸杞!"<<endl;

   }

};

//业务函数

voidDoWork(AbstractDrinking*drink) {

   drink->MakeDrink();

   deletedrink;

}

voidtest01() {

   DoWork(newCoffee);

   cout<<"--------------"<<endl;

   DoWork(newTea);

}

intmain() {

   test01();

   system("pause");

   return0;

}

像制作其他的饮品且制作方法类似时我们就可以使用多态,想要添加新的饮品时不需要动原来的代码,很方便。


目录
相关文章
|
7天前
|
存储 算法 搜索推荐
【C++】类的默认成员函数
【C++】类的默认成员函数
|
27天前
|
C++ 运维
开发与运维函数问题之析构函数在C++类中起什么作用如何解决
开发与运维函数问题之析构函数在C++类中起什么作用如何解决
29 11
|
27天前
|
C++ 运维
开发与运维函数问题之C++类的简单示例如何解决
开发与运维函数问题之C++类的简单示例如何解决
45 10
|
26天前
|
机器学习/深度学习 算法 C++
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
|
5天前
|
Dart 编译器 API
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
|
11天前
|
JavaScript C++
【C++ visual studio】解决VS报错:error C2447: “{”: 缺少函数标题(是否是老式的形式表?)【亲测有效,无效捶我】
【C++ visual studio】解决VS报错:error C2447: “{”: 缺少函数标题(是否是老式的形式表?)【亲测有效,无效捶我】
|
26天前
|
机器学习/深度学习 PyTorch 算法框架/工具
C++多态崩溃问题之在PyTorch中,如何定义一个简单的线性回归模型
C++多态崩溃问题之在PyTorch中,如何定义一个简单的线性回归模型
|
27天前
|
Rust 编译器 测试技术
Rust与C++的区别及使用问题之Rust中函数参数传递的问题如何解决
Rust与C++的区别及使用问题之Rust中函数参数传递的问题如何解决
|
27天前
|
Java C++ 运维
开发与运维函数问题之C++中有哪些继承方式如何解决
开发与运维函数问题之C++中有哪些继承方式如何解决
17 0
|
7天前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
13 0