大厂题第1辑——虚函数七题精讲之3:纯虚函数

news2024/11/26 4:21:37
  1. 什么是纯虚函数?
  2. 什么是抽象类?
  3. 纯虚函数可以提供实现吗?有什么意义?

题6-什么是纯虚函数?

C++中有两种继承:接口继承和实现继承。二者的第一个区别是:基类都干了些什么?

  • 如果基类啥实事不干,只是提出了:目标、要求,即提出了 “希望有”的东西,而不真正实现,那么继承这个“不干实事”的基类的,就叫接口继承。
  • 反过来,如果基类好歹干了点事,提供了某些功能的实现(哪怕是个半成品),那么继承它,就叫实现继承。

放在现实生活中,“接口继承”大概类似于“继承遗志”,而“实现继承”相当于“继承遗产”。

  • 前者:一个父亲,自己没有读大学,但希望儿女们实现读清华北大的目标;一个父亲,自己一分存款没有,但希望自己女儿非富即贵,这样的父亲(基类)的儿女(派生类),自然只能“继承遗志”。
  • 后者:一个拥有两家上市企业,五十套一线城市房产,银行存款15个亿……他的儿女将来可以继承遗产。

如果某个基类,在某个功能上,一点都没有实现,但又希望派生类能实现,这个功能就可以使用一个只声明规格(只提要求),不提供任何实现的成员函数来表达,这个成员函数就叫 “纯虚函数 / pure virtual function”。

比如,有个“父亲”类,在发财这件事上的实现度完全是零(幸好不是负数),而在学识这件事上,实现了部分高中文化,那么这个类的设计就是:

class Father
{
public:
    // 财富
    virtual void Fortune() = 0; // 纯虚函数

    // 学识
    virtual void Learning() 
    {
         cout << "清华池高中肄业";
    }
};

成员函数 “Fortune()” 被标记上“virtual”,同时还标记为 “ = 0 ”,在C++当中,这就是表明它是一个“纯虚函数”。语义是:本基类完全不知道如何提供 “财富()” 的实现,派生类们,你们好好努力,一定要好好实现啊!

请大家对比一下 Fortune 和 Learning。

题7-什么是抽象类?

一个类(结构也一样,下同),只要拥有一个纯虚函数,这个类就是 “抽象类 (Abstract class)”。抽象类没办法创建出真实的对象,比如:

Father f; // 失败,因为 Father::Fortune() 是纯虚函数

如果一个类所有成员函数都是纯虚函数,那么这个类我们通常也称为“接口 / interface”。比如:

class Target
{
public:
     virtual void Fly() = 0; // 会飞
     virtual void Cry() = 0; // 会哭
     virtual void Say() = 0; // 会说
};

因此,所谓的“接口”,其实就是自己一点实事不干,却给未来的后代(派生类)们提了一堆要求的家伙……

以抽象类为基类的派生类怎么办呢?可以一个一个虚函数都实现,也可以挑选某些虚函数加以实现,另外的一些暂不实现,留给派生类的派生类(一代一代继承遗志啊!)。实现在不爽,也可以一个都不实现,然后还再添加几个新的纯虚函数……

因此,关于抽象类的更准确的定义是:一个类,不管是自己加的,还是是继承而来,只要拥有一个纯虚函数,就是抽象类。

题8-纯虚函数可以提供实现吗?有什么意义?

会问这个问题的考官,八成有些 “刁”……

没错,一个虚函数确实可以在被声明为 “ = 0 ” 的同时,又提供了具体实现,比如:

class Father
{
public:
    virtual void Fortune() = 0 ;
};

void Father::Fortune() // 正确,可行
{
   cout << "孩子,其实咱们家有前清留下的两亿银票";
}

注意,实现必须在类外,不能在声明纯虚成员函数时直接加上定义——我也不知道为什么,大概是那样写实现有点过份“造假”——刚说 “ = 0”,马上就有了实现?

class Father
{
public:
    virtual void Fortune() = 0 // 错误,不可行
    {
       cout << "孩子,其实咱们家有前清留下的两亿银票" ;
    }
};

为一个纯虚类提供实现,有什么意义和作用吗?

答:几乎没有意义,为纯虚函数提供定义,改不了当前类被视为抽象类的局面。当前类仍然无法实例化。不过,一个有定义(实现)的纯虚函数确实可以被调用。比如:

class Father
{
public:
    virtual void Fortune() = 0 ;
};

void Father::Fortune() // 正确,可行
{
   cout << "孩子,其实咱们家有前清留下的两亿银票";
}

class Son : public Father
{
    void Fortune() override
    {
         Father::Fortune(); // 调用基类的纯虚函数!!!
         cout << "\n真的吗?\n" << endl;
    }
};

如果没有提供纯虚函数 “Father::Fortune()” 的实际定义,以上在代码要么在编译时出错(本例),要么在运行时出错(更复杂的情况下)。出错位置就在注释为 “调用基类的纯虚函数!!!”那行。

在一个复杂的系统里,编译器有时候无法检测出代码调用了一个没有实现的纯虚函数,这就会造成运行期错误,以至程序意外退出。所以,为纯虚函数提供实现(哪怕是空实现,或者输出错误信息),可以有效躲开这种运行期错误——但是,这种做法事实上也隐藏了程序可能的设计错误或实现错误,所以它被视为是一种实用的,但不一定是好的做法。

为纯虚的析构函数提供默认的实现(通常就是空实现),倒是一个被写上书的好做法。具体我们在后续 “虚析构函数”时再做讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/722634.html

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

相关文章

15.2 BP神经网络实现图像压缩——基于BP神经网络的图像压缩(matlab程序)

1.简述 BP神经网络的图像压缩原理 数字图像压缩实际上是以较少的比特数有损或者无损的来表示原来像素矩阵的一种图像处理技术,实际上就是减少图像数据中的时间冗余,空间冗余,频谱冗余等等作为目的,从而同过减少上述的一种或者多种冗余的信息而达到更加高效的存储与传输数据.图…

目标检测的评估指标

Precision(精确率/查准率)&#xff1a;是指在所有被预测为正的样本中&#xff0c;确实是正样本的占比。当Precision越大时&#xff0c;FP越小&#xff0c;此时将其他类别预测为本类别的个数也就越少&#xff0c;可以理解为预测出的正例纯度越高。Precision越高&#xff0c;误检…

LLM驱动的智能体#Mixcopilot的迭代演进

论文&#xff1a; Generative Agents: Interactive Simulacra of Human Behavior shadow 前阵子在一场线下活动&#xff0c;我们展开了对生成式智能体的分享和研讨&#xff0c;同时也介绍了Earth在实现智能体系统的思考和实践。 最近有一篇文章把LLM驱动的智能体的构成讲解的很…

centos7安装图形化界面

一键安装并生效脚本 #!/bin/bash # 安装X(X Window System) yum groupinstall -y "X Window System"# 安装图形界面软件 yum groupinstall -y "GNOME Desktop"# 设置开机进入图形界面 systemctl set-default graphical.target# 进入图形界面 startx安装 …

Windows | [出现错误 2147942402 (0x80070002) (启动“ubuntu2004.exe”时)]

Windows | [出现错误 2147942402 (0x80070002) (启动“ubuntu2004.exe”时)] C:\WINDOWS\system32\wsl.exe -d Ubuntu-20.04

Verilog基本语法之数据类型

Verilog 是一种用于数字逻辑电路设计的硬件描述语言&#xff0c;可以用来进行数字电路的仿真验证、时序分析、逻辑综合。 既是一种行为级&#xff08;可用于电路的功能描述&#xff09;描述语言又是一种结构性&#xff08;可用于元器件及其之间的连接&#xff09;描述语言。 …

深度了解机器人行业全貌

产品分类 机器人主要可分为工业机器人、服务机器人和特种机器人,主要产品如下图所示。 机器人主要分类 资料来源:36氪、华泰证券《机械设备行业专题研究-商用服务机器人:曙光已现蓝海可期-220105》。 其中工业机器人的主要种类及应用领域如下图所示。 工业机器人主要类型及…

docker安装失败 应用程序无法启动,因为应用程序的并行配置不正确

问题描述 报错“应用程序无法启动&#xff0c;因为应用程序的并行配置不正确”。 配置&#xff1a;windows10 解决过程 网上的解决方案有三种&#xff1a; 启动windows服务Windows Modules Installer。运行sxstrace.exe。安装visual c相关依赖。下载visual studio installer…

Python基础 —— 输入输出

〇、概述 当我们编写代码时&#xff0c;必不可少地需要通过敲击键盘来向电脑输入数据&#xff0c;然后显示器将把我们想要的内容显示出来&#xff1b;这其中需要很多复杂的知识&#xff0c;为了简化操作&#xff0c;便有人将其封装成了 print() 和 input() 两个函数。 一、输出…

LiDAR SLAM 闭环——BoW3D论文详解

标题&#xff1a;BoW3D: Bag of Words for Real-Time Loop Closing in 3D LiDAR SLAM 作者&#xff1a;Yunge Cui,Xieyuanli Chen,Yinlong Zhang,Jiahua Dong,Qingxiao Wu,Feng Zhu 机构&#xff1a;中科院沈阳自动化研究所 来源&#xff1a;2022 RAL 现算法已经开源&#…

linux查看文件夹的命令

第一种&#xff1a; 最简单的查看方法可以使用ls -ll、ls-lh命令进行查看&#xff0c;当使用ls -ll&#xff0c;会显示成字节大小&#xff0c;而ls- lh会以KB、MB等为单位进行显示&#xff0c;这样比较直观一些。 ls -ll ls -lh 第二种&#xff1a; 通过命令du -h –max-de…

微信小程序视图层莫名出现”竖线“

写完视图层后&#xff0c;发现页面上莫名其妙的出现了一些“竖线”&#xff0c;如下图所示&#xff1a; 这段html代码是这样写的&#xff1a; <view class"other-des"><view class"section"><text class"section-num">{{cou…

服务器财务系统数据库被locked勒索病毒攻击后如何怎么办?如何快速解密恢复数据

在当今的数字化时代&#xff0c;信息安全问题已成为企业面临的重大挑战之一。企业的服务器财务系统数据库是企业最核心的资金管理和财务决策平台&#xff0c;一旦遭受勒索病毒攻击&#xff0c;重要财务数据并被锁定&#xff0c;可能导致严重的经济损失和业务中断。近期&#xf…

企业为什么需要软件的应用框架?

软件框架是可用来构建软件的结构。它充当系统的基础&#xff0c;使开发者不必从头开始创建&#xff0c;比如非必要的额外逻辑。框架还类似于模板&#xff0c;你可以对其进行修改并添加某些特性和更高级功能&#xff0c;然后创建许多人可以使用的复杂而普适的项目。 软件的应用…

python 笔记 math包

abs 绝对值 acos 反余弦函数 acosh 反双曲余弦函数 asin 反正弦函数 asinh 反双曲正弦函数 atan 反正切函数 atanh 反双曲正切函数 cos 余弦函数 cosh 双曲余弦函数 e 自然常数 exp e的几次方 fabs 绝对值 gcd 最大公约数 log log2 log10 modf 取小数、取整数部分 …

gitlab【安装部署、备份与恢复】

【1】安装依赖 [rootgit ~]# yum -y install install curl opessh-server postfix wget【2】安装软件包 [rootgit ~]# yum -y localinstall gitlab-ce-11.2.3-ce.0.el7.x86_64.rpm 【3】修改配置 [rootgit ~]# grep "^[a-Z]" /etc/gitlab/gitlab.rb external_ur…

【爬虫学习】1、利用get方法对豆瓣电影数据进行爬取

♥️作者&#xff1a;白日参商 &#x1f935;‍♂️个人主页&#xff1a;白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

Z-NTFS2EXCEL 文件服务器权限可视化报告

Z-NTFS2EXCEL Z-NTFS2EXCEL是一个用于快速获取Windows文件服务器权限信息并进行确认或审计的程序。 github地址&#xff1a;https://github.com/ericzhong2010/Z-NTFS2EXCEL 使用示例 编辑ini配置文件 执行exe程序文件 检查与确认结果 作者信息 作者&#xff1a;Eric…

Docker学习笔记17

跨主机容器间网络&#xff1a; 实现跨主机容器间通信的工具&#xff1a; 1&#xff09;Pipework 2&#xff09;Flannel 3&#xff09;Weave 4&#xff09;Open V Switch &#xff08;OVS&#xff09; 5&#xff09;Calico 1. Weave&#xff1a; 在每个宿主机上布置一个特…

SwiftUI的优缺点

2019年WWDC大会上&#xff0c;苹果在压轴环节向大众宣布了基于Swift语言构建的全新UI框架——SwiftUI&#xff0c;开发者可通过它快速为所有的Apple平台创建美观、动态的应用程序。推荐大量使用struct代替类。 SwiftUI 就是⼀种声明式的构建界面的用户接口工具包。 SwiftUI使用…