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

news2024/11/18 7:37:30

一.纯虚函数的由来

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

例如:

#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,所以子类不必在函数前加virtual
    void 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.coloradmin.cn/o/1233705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023-11-20 LeetCode每日一题(最大子数组和)

2023-11-20每日一题 一、题目编号 53. 最大子数组和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的…

装机 - 12400F有必要换成13400F吗

想组个跑AI大模型的机器&#xff0c;预算5000左右。3090&#xff0c;4090玩不起&#xff0c;搞了个2080ti魔改22G的。 大佬们帮忙看看这个配置咋样&#xff0c;12400F有必要换成13400F吗。 感觉13400f多出的四个能效核除了跑分作用不大&#xff1f;网上看别人说大小核架构用win…

麒麟KYSEC使用方法03-开启及关闭netctl

原文链接&#xff1a;麒麟KYSEC使用方法03-开启及关闭netctl hello&#xff0c;大家好啊&#xff0c;今天给大家带来麒麟KYLINOS的kysec使用方法系列文章第三篇内容----使用命令开启及关闭netctl&#xff0c;联网控制策略有三种模式&#xff0c;off/enforing/warning&#xff0…

VsCode连接远程Linux编译环境的便捷处理

1.免输登录密码 免输命令的正确方法是使用公钥和私鈅在研发设备&#xff0c;和linux服务器上校验身份。公钥和私钥可在windows系统上生成。公钥要发送到linux服务器。私钥需要通知给本地的ssh客户端程序&#xff0c;相关的操作如下&#xff1a; 生成 SSH Key&#xff1a; 打开…

FCOS: Fully Convolutional One-Stage Object Detection 论文源代码复现

FCOS源代码github地址为&#xff1a; FCOS 这篇论文主要是关于目标检测的&#xff0c;今天跑一下它的实验&#xff0c;我是在autodl租的RTX 2080 Ti&#xff0c;因为这个代码比较久&#xff0c;所以Pytoch版本可能不可以装太高&#xff0c;我的镜像CUDA版本为10.1&#xff0c;…

深入 Django 的 URL 分发器

概要 在 Django 的 MVC 架构中&#xff0c;URL 分发器扮演着至关重要的角色&#xff0c;它负责将用户的请求路由到相应的视图函数或类。这一机制不仅保证了 Django 应用的高度可扩展性&#xff0c;还为开发者提供了灵活的 URL 设计能力。本文将详细介绍 Django 中的 URL 分发器…

线性表,但是是Java中数组实用使用!

线性表定义&#xff1a; 由n (n≥0)个数据特性相同的元素构成的有限序列称为线性表&#xff0c;(n0)的时候被称为空表。 线性表的顺序表示 线性表的顺序存储又被称为顺序表 优点 无需为表示表中元素之间的逻辑关系而增加额外的存储空间可以随意读取任意位置的元素 缺点 插入…

手把手教你通过CODESYS V3进行PLC编程(一)

教程背景 宏集MC系列模块化控制器是基于Raspberry Pi的高性能4核控制器&#xff0c;运动控制循环时间最快可达500微秒&#xff0c;实现了计算能力和成本之间的最佳平衡&#xff0c;适用于多轴运动控制和CNC控制。 教程目的 本系列教程将使用宏集MC系列控制器&#xff0c;详细…

极空间z2pro bitwarden+frp+nginx教程

z2pro Bitwarden Frp Nginx教程 本案例仅供记录 使用时按照自己的IP和端口进行 灵活变通 本案例中使用的设备&#xff1a; NAS&#xff1a;z2pro域名&#xff1a;est.xyz云服务器&#xff1a;腾讯云&#xff08;公网ip&#xff1a;43.43.43.143&#xff09; 一&#xff0c;Va…

Unity - 实现模型动态伸长缩短,贴图不变形(材质球参数篇)

思路为修改模型材质球的Tiling参数&#xff0c;根据与自身localScale的值得到合适的比例&#xff0c;再修改Tiling值 var mat target.transform.GetComponent<Renderer>().material; var oriValue mat.mainTextureScale;//沿着Y轴伸缩 oriValue.y 1 * target.transfo…

动手学深度学习(二)---线性回归

文章目录 1.线性回归从0实现2.线性回归简洁实现【相关方法】 1.线性回归从0实现 从0开始实现整个方法&#xff0c;包括数据流水线、模型、损失函数和小批量随机梯度下降优化器 &#xff08;1&#xff09;导入需要的包 % matplotlib inline import random import torch from d…

3分钟看完NVIDIA GPU架构及演进

近期随着 AI 市场的爆发式增长&#xff0c;作为 AI 背后技术的核心之一 GPU&#xff08;图形处理器&#xff09;的价格也水涨船高。GPU 在人工智能中发挥着巨大的重要&#xff0c;特别是在计算和数据处理方面。目前生产 GPU 主流厂商其实并不多&#xff0c;主要就是 NVIDIA、AM…

《研发效能 100 问》首发,多位专家解读「研效提升」的破局之道?

为了可以帮助更多研发管理者和研发效能负责人&#xff0c;了解构建研发效能体系应从何做起&#xff0c;以及在构建过程中需要解决哪些疑难问题&#xff0c;有哪些最佳实践可以借鉴。2023 年 7 月&#xff0c;思码逸发起&#xff0c;由行业知名研发效能专家张乐老师担任出品人&a…

【Skynet 入门实战练习】开发环境搭建 | 运行第一个项目 | debug console 简单使用

文章目录 写在前面开发环境搭建skynet配置文件项目&#xff0c;启动&#xff01; debug console 写在前面 本系列【Skynet 入门实战练习】所有源码同步&#xff1a;https://gitee.com/Cauchy_AQ/skynet_practice 开发环境搭建 skynet skynet 框架地址&#xff1a;https://g…

第7章-使用统计方法进行变量有效性测试-7.4.1-简单线性回归

目录 基本概念 变量之间的关系 相关分析 回归分析 相关分析和回归分析的关系 一元线性回归模型 总体回归函数 样本回归函数 线性回归模型的假定 普通最小二乘法&#xff08;Ordinary Least Squares&#xff0c;OLS&#xff09; 拟合优度指标 回归系数估计量的性质 …

主播-产品痛点话术

—、用户体验差我们的产品在用户体验方面存在一些问题。首先&#xff0c;产品的操作流程不够顺畅&#xff0c;导致用户在使用过程中经常遇到困扰。另外&#xff0c;我们的产品界面设计不够美观&#xff0c;无法给用户带来愉悦的使用体验。针对这些问题&#xff0c;我们将对产品…

2015-2020年全国地区生产总值及一二三产构成数据总览,shp/excel格式

今天我们来整理了2015-2020全国地区生产总值及一二三产构成数据&#xff0c;数据格式为shpexcel格式&#xff0c;数据精度可达各区县。 另外&#xff0c;需要说明的是&#xff1a;由于统计年鉴指标调整&#xff0c;每一年的数据并非字段相同&#xff0c;字段详情请参考已下载数…

KT142C语音芯片客户反馈电脑端的配置文件,打开都正常,但是拷贝到KT142C内部就乱码

KT142C语音芯片客户反馈电脑端的配置文件&#xff0c;打开都正常&#xff0c;但是拷贝到KT142C内部就乱码 首先解释一下原理&#xff0c;KT142C内置的330Kbyte空间可供用户下载&#xff0c;实际上拿出程序部分的空间 作为声音存储介质的&#xff0c;也就是说&#xff0c;代码空…

SDWAN厂家排名

随着网络技术的不断发展&#xff0c;SDWAN&#xff08;软件定义广域网&#xff09;作为一种新兴的网络架构&#xff0c;正在受到越来 越多企业的关注和采用。选择一家可靠的SDWAN厂家成为企业成功部署和管理SDWAN的关键。本文将从技术实力、客户口碑以及市场占有率三个方面&…

数据仓库模式之详解 Inmon 和 Kimball

目录 一、前言 二、企业信息工厂&#xff08;Inmon&#xff09; 2.1 概念 2.2 主要组件 2.3 流程 三、多维数据仓库&#xff08;Kimball&#xff09; 3.1 概念 3.2 核心组件 3.3 流程 四、异同及用途对比 4.1 异同对比 4.2 特征比较 一、前言 大部分关于数据仓库构建…