当前位置: 首页 > news >正文

C++纯虚函数和抽象类 制作饮品案例(涉及知识点:继承,多态,实例化继承抽象类的子类,多文件实现项目)

一.纯虚函数的由来

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

例如:

#include<iostream>using namespace std;class AbstractCalculator
{
public:int m_Num1;int m_Num2;virtual int getResult(){return 0;}
};//加法计算器类
class AddCalculator :public AbstractCalculator
{
public:int getResult(){return m_Num1+m_Num2;}};
AbstractCalculator类是一个父类,里面 getResult()函数的实现是无意义的。
因此可以将虚函数改为纯虚函数。

二.纯虚函数语法

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

三.抽象类及特点

当类中有了纯虚函数,这个类也称为抽象类。
特点:
1.抽象类无法实例化对象
2.子类必须重写抽象类中的纯虚函数,否则也属于抽象类

四.制作饮品案例

在这里插入图片描述

4.1 单文件实现该案例

创建c++文件 drinking.cpp

#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,所以子类不必在函数前加virtualvoid Boil(){cout<<"煮农夫山泉1"<<endl;}    void Brew(){cout<<"冲泡咖啡1"<<endl;}void PourInCup(){cout<<"倒入杯中1"<<endl;}void PutSomething(){cout<<"加入糖和牛奶1"<<endl;}
};int main()
{AbstractDrinking* drink;// Coffee(); 像是函数的声明,所以一般实例化类时,当构造函数为空,则不用加括号,直接 Coffee。drink = new Coffee;// drink = new Coffee();drink->makeDrink();delete drink;return 0;
}

linux端编译和运行:

按 ctrl+` 弹出终端

输入如下命令:

g++ drinking.cpp

生成一个可执行文件 a.out

# 执行
./a.out

4.1 多文件实现该案例

4.1.1创建include文件,在里面创建类的头文件,用来声明函数

AbstractDrinking.h
#pragma once
using namespace std;class AbstractDrinking
{
public://煮水virtual void Boil() = 0;//冲泡virtual void Brew() = 0;//倒入杯中virtual void PourInCup() = 0;//加入辅料virtual void PutSomething() = 0;void makeDrink();};
Coffee.h
#pragma once
#include<AbstractDrinking.h>
using namespace std;//制作咖啡
class Coffee: public AbstractDrinking
{
public:virtual void Boil();virtual void Brew();virtual void PourInCup();virtual void PutSomething();
};

4.1.2 创建src文件,里面放置类的实现

AbstractDrinking.cpp
#include "AbstractDrinking.h"//合并制作饮品流程
void AbstractDrinking::makeDrink()
{Boil();Brew();PourInCup();PutSomething();
}
Coffee.cpp
#include "Coffee.h"
#include<iostream>void Coffee::Boil()
{cout<<"煮农夫山泉"<<endl;
}    
void Coffee::Brew()
{cout<<"冲泡咖啡"<<endl;
}
void Coffee::PourInCup()
{cout<<"倒入杯中"<<endl;
}
void Coffee::PutSomething()
{cout<<"加入糖和牛奶"<<endl;
}

4.1.3 项目主目录创建main.cpp文件

#include<iostream>
#include "AbstractDrinking.h"
#include "Coffee.h"using namespace std;int main()
{AbstractDrinking* drink;drink = new Coffee;// drink = new Coffee1();drink->makeDrink();delete drink;return 0;
}

4.1.4 编译和执行

g++ main.cpp src/AbstractDrinking.cpp src/Coffee.cpp -Iinclude -o b.out
./b.out
http://www.lryc.cn/news/241428.html

相关文章:

  • 什么是网关和链路追踪,以及怎么使用?
  • git 文件被莫名其妙的或略且无论如何都查不到哪个.gitignore文件忽略的
  • nova组件简介
  • 【Vue】响应式与数据劫持
  • Modbus RTU转Profinet网关连接PLC与变频器通讯在机床上应用案例
  • Autoware 整体架构
  • 【maven】手动指定jar推送
  • 算法---定长子串中元音的最大数目
  • 美国汽车零部件巨头 AutoZone 遭遇网络攻击
  • WPF面试题入门篇
  • opencv-ORB检测
  • please upgrade numpy version to >=1.20
  • 关于进制的转化
  • JVM 之 字节码指令
  • 阿里云跨账号建立局域网
  • 【OpenSTL】方便好用的时空预测开源库
  • 【Unity】IBeginDragHandler、IDragHandler 和 IEndDragHandler 介绍
  • 杰发科技AC7801——Flash模拟EEP内存分布情况
  • 【前端知识】Node——http模块url模块的常用操作
  • 平衡二叉树 (简单易懂)
  • Vue.observable 是什么
  • 【五年创作纪念日】
  • 数据库基础入门 — SQL排序与分页
  • WordPress站点屏蔽过滤垃圾评论教程(Akismet反垃圾评论插件)
  • Modbus-RTU协议讲解与实战
  • 数据结构 查找基本概念
  • 『Linux升级路』基础开发工具——gcc/g++篇
  • 面试:RocketMQ相关问题
  • 2304. 网格中的最小路径代价 : 从「图论最短路」过渡到「O(1) 空间的原地模拟」
  • 【机器学习】算法性能评估常用指标总结