C++之纯虚函数与抽象类

2023-11-01

C++之纯虚函数与抽象类

什么是纯虚函数?

纯虚函数是将基类中的函数声明为虚函数=0的函数。纯虚函数只能声明,不能定义,因为纯虚函数没有函数体。纯虚函数的写法为 virtual 函数返回类型 函数名(参数列表)=0;其中 =0 并不是将函数赋值为0,而是告知编译器这是纯虚函数。

什么是抽象类

包含纯虚函数的类称为抽象类,一般都是将基类写成抽象类,由于纯虚函数没有函数体,因此无法定义,不能被调用,系统也就无法为其分配内存,所以抽象类不能实例化对象。基类中的纯虚函数可以由派生类去实现,但是需要派生类将基类中的纯虚函数全部实现,否则派生类将无法实例化。(假如基类中有两个纯虚函数,派生类只实现了一个,那么将无法实例化)

#include <iostream>
#include <thread>

using namespace std;

class People {
public:
    People(int b);

    virtual ~People();

    virtual void run() = 0;

    virtual int swim(int a) = 0;


private:
    int b;
};

People::People(int b) : b(b) { cout << "People constructed is created" << endl; }

People::~People() { cout << "People destructed is used" << endl; }

class SonPeople : public People {
public:
    SonPeople(int b, int c);

    ~SonPeople();

    int swim(int a);

    void run();

private:
    int c;
};

SonPeople::SonPeople(int b, int c) : People(b), c(c) {
    cout << "SonPeople constructed is created" << endl;
}

SonPeople::~SonPeople() { cout << "SonPeople destructed is used" << endl; }

int SonPeople::swim(int a) { return 0; }

void SonPeople::run() { cout << "this is run function" << endl; }

int main() {
    People *ptr = new SonPeople(2, 3);
    int swim = ptr->swim(3);
    cout << "ptr->swim():" << swim << endl;
    ptr->run();
    delete ptr;
    return 0;
}
输出:
People constructed is created
SonPeople constructed is created
ptr->swim():0
this is run function
SonPeople destructed is used
People destructed is used

在实际开发中,你可以定义一个抽象基类,只完成部分功能,未完成的功能交给派生类去实现(谁派生谁实现)。这部分未完成的功能,往往是基类不需要的,或者在基类中无法实现的。虽然抽象基类没有完成,但是却强制要求派生类完成,这就是抽象基类的“霸王条款”。
抽象基类除了约束派生类的功能,还可以实现多态。上述程序中基类指针 ptr 的类型是People,但是它却可以访问派生类中的 swim() 和 run() 函数,这是由于在 People 类中将这两个函数定义为纯虚函数,实现了多态。这或许才是C++提供纯虚函数的主要目的。
关于纯虚函数的几点说明
1.一个纯虚函数就可以使类成为抽象基类,但是抽象基类中除了包含纯虚函数外,还可以包含其它的成员函数(虚函数或普通函数)和成员变量。
2.只有类中的虚函数才能被声明为纯虚函数,普通成员函数和顶层函数不能声明为纯虚函数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++之纯虚函数与抽象类 的相关文章

随机推荐

  • 百度自动驾驶平台生态部负责人张亮:Apollo开放平台,连接技术场景 赋能人才生态

    社会的经济发展 国家政策的支持 科学技术的不断进步 消费者的购买热情 共同推动了自动驾驶行业的发展 自动驾驶汽车会使交通事故的发生率大大降低 方便更多的人开车出行 交通秩序变得更好 出行效率变得更高 2022年7月21日 由中国开源软件推进
  • kafka confluent schema registry 实现一个topic支持多个不同schema的表消费(包含报错信息及解决方式)

    背景 上篇文章已经说明confluent schema registry优点及如何实现 本文实现kafka confluent schema registry 一个topic多个不同结构的表消费需求 上篇文章 kafka Confluent
  • 【重构】-重复代码(duplicated Code)

    重构一 duplicated Code 重复代码 场景演义 议题一 同一个类的两个函数有相同代码片段 重构手法 Extract Method 把一段代码组织在一起并独立 放进一个独立函数中 并让函数名称解析该函数的用途 演义讲解 publi
  • 服务器终端辐射有多大,服务器辐射大吗

    如今很多人的工作岗位都是在服务器机房里 而大家最为担心的就是服务器机房会有辐射影响 那么服务器辐射大吗 接下来佰佰安全网来为大家讲解下吧 一 服务器机房辐射大吗 通常服务器机房都需要隔离 这是为什么呢 因为里面主机长时间开机 会散发出一定的
  • 2023校招4399笔试

    之前暑期实习投过一次 做的比较拉跨 这次感觉还可以 思路基本上差不多 就是具体的实现 二三题都是只写了一个最后的函数 不知道对不对 TCP服务端调用API顺序 应该是先绑定端口 再开始监听 接收到客户端请求建立连接 接受或发送数据 最后关闭
  • 分享一个查看css版本兼容性的网站: https://caniuse.com/

    最近在处理浏览器对img标签的图片是否会根据exif信息自动旋转的问题 发现了这个站点 https caniuse com 比如 image orientation https caniuse com search image orient
  • 重新安装系统Windows defender显示页面不可用解决方法

    重装系统后打开Windows安全中心出现 页面不可用 你的 IT 管理员已限制对此应用的某些区域的访问 并且你尝试访问的项目不可 用 有关详细信息 请与 IT 支持人员联系 个人电脑 第一种方法 无论是否安装三方杀毒软件 请您打开 控制面板
  • 计算机网络性能衡量

    1 速率 单位时间 s 内传输信息 bit 量 单位 KB s MB s Gb s K 10 3 M 10 6 G 10 9 一般表示的是理想的传输速率 2 带宽 计算机网络中的带宽和通信等领域的带宽概念不一样 计算机网络中的带宽是指数字信
  • python编写一个函数判断一个数是否为偶数_c语言中判断奇数偶数的函数_创建一个函数来检查Python中的偶数或奇数...

    c语言中判断奇数偶数的函数 In the below program we are creating a function named CheckEvenOdd it accepts a number and returns EVEN if
  • 【经典】数加 ·营销引擎之DSP详解------DSP 、SSP、RTB

    数加 营销引擎 帮助企业快速搭建或升级自有DSP ADN DMP系统 提供高质量的竞价 投放 受众定向 pCTR点击率预估 pCVR转化率预估 相关性评估等核心能力 准备工作 基础认知 DSP 信息流虽然诞生已久 但大热还是近两年的事情 一
  • 合并两个有序数组(C语言)

    让我们来看一下这道题的描述 题目描述 题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你合并 nums2 到 nums1 中 使合并后
  • torchvision.dataset下载CIFAR10报错解决方法

    使用dataset下载数据集时 出现错误 urllib error URLError urlopen error unknown url type https 考虑没有import ssl 遂补充以下命令 import ssl ssl cr
  • Petya and Exam【Codeforces 1282 C】【贪心】

    Codeforces Round 610 Div 2 C 有N道题目 题目有简单与困难之分 简单的题目花费A分钟 困难的题目花费B分钟 那么考试时间一共有T的情况下 我们是可以提前交卷的 但是有些时间限制 就是譬如说你现在第x分钟交卷 但是
  • 部署项目到服务器

    部署项目到服务器 1 购买服务器 阿里云官网 2 安装宝塔面板 相当于服务器的图形化操作界面 3 开放端口 云服务器端口 宝塔面板端口 4 下载插件 5 部署前后端项目 步骤二 安装宝塔面板 进入到服务器 使用命令安装宝塔 yum inst
  • hive动态分区插入数据

    往hive分区表中插入数据时 如果需要创建的分区很多 比如以表中某个字段进行分区存储 则需要复制粘贴修改很多sql去执行 效率低 因为hive是批处理系统 所以hive提供了一个动态分区功能 其可以基于查询参数的位置去推断分区的名称 从而建
  • 阻塞和非阻塞,同步和异步

    1 例子 故事 老王烧开水 出场人物 老张 水壶两把 普通水壶 简称水壶 会响的水壶 简称响水壶 老王想了想 有好几种等待方式 1 老王用水壶煮水 并且站在那里 不管水开没开 每隔一定时间看看水开了没 同步阻塞 老王想了想 这种方法不够聪明
  • Python与数据分析库Pandas进阶

    引言 Python是一种广泛使用的编程语言 它可以用于各种任务 包括科学计算 数据分析 Web开发和人工智能等 其中 数据分析是Python最强大的领域之一 Python的Pandas库是Python数据分析的中心组件 它为数据科学家和分析
  • 三相同步电机怎么接线图_三相异步电机的正反转原理图解

    来源 网络 异步电动机又称感应电动机 是由气隙旋转磁场与转子绕组感应电流相互作用产生电磁转矩 从而实现机电能量转换为机械能量的一种交流电机 三相异步电机主要用作电动机 拖动各种生产机械 例如 风机 泵 压缩机 机床 轻工及矿山机械 农业生产
  • Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by ser

    导语 Error ER NOT SUPPORTED AUTH MODE Client does not support authentication protocol requested by ser 作者 变优秀的小白 Github 关注
  • C++之纯虚函数与抽象类

    C 之纯虚函数与抽象类 什么是纯虚函数 什么是抽象类 什么是纯虚函数 纯虚函数是将基类中的函数声明为虚函数 0的函数 纯虚函数只能声明 不能定义 因为纯虚函数没有函数体 纯虚函数的写法为 virtual 函数返回类型 函数名 参数列表 0