C++ 高级面试题:解释 C++ 中的抽象基类和纯虚函数

解释 C++ 中的抽象基类和纯虚函数

在C++中,抽象基类和纯虚函数是面向对象编程中的重要概念,用于实现多态性和接口规范。它们通常与继承和多态结合使用,以实现接口的统一定义和派生类的不同实现。

抽象基类(Abstract Base Class):
抽象基类是一个包含纯虚函数的类,它用于定义接口规范但不能被实例化。抽象基类的存在是为了提供一种接口,而不是具体的实现。抽象基类只能作为其他类的基类,派生类必须实现所有基类的纯虚函数才能被实例化。

纯虚函数(Pure Virtual Function):
纯虚函数是在基类中声明的虚函数,但没有提供具体的实现。它的声明方式是在函数声明后加上 = 0。纯虚函数告诉编译器,派生类必须提供自己的实现来满足接口规范。

示例:

// 抽象基类
class Shape {
public:// 纯虚函数,表示该函数在基类中没有实现virtual double area() const = 0;
};// 派生类1
class Circle : public Shape {
private:double radius;public:// 实现纯虚函数 area()double area() const override {return 3.14159 * radius * radius;}
};// 派生类2
class Rectangle : public Shape {
private:double width;double height;public:// 实现纯虚函数 area()double area() const override {return width * height;}
};int main() {// Shape* 类型的指针可以指向派生类对象Shape* shape1 = new Circle();Shape* shape2 = new Rectangle();// 使用指针调用纯虚函数 area(),根据对象的实际类型调用对应的实现double area1 = shape1->area();double area2 = shape2->area();delete shape1;delete shape2;return 0;
}

在这个示例中,Shape 是一个抽象基类,它包含一个纯虚函数 area()。Circle 和 Rectangle 是 Shape 的两个派生类,它们都必须实现 area() 函数才能被实例化。通过使用抽象基类和纯虚函数,我们可以实现多态性,让不同类型的对象都可以以统一的接口进行操作。

更详细具体的内容

抽象基类和纯虚函数在 C++ 中是实现多态性和接口规范的关键机制。让我们更详细地了解它们,并通过一个更复杂的示例来说明它们的用法。

抽象基类(Abstract Base Class):
抽象基类是一个包含纯虚函数的类,它负责定义接口规范,但不能被实例化。抽象基类的目的是为了提供一种通用的接口,供派生类实现。在抽象基类中,可以包含普通的成员函数和数据成员,但通常不会包含完整的实现,因为它们没有意义。

纯虚函数(Pure Virtual Function):
纯虚函数是在基类中声明的虚函数,但没有提供具体的实现。它的声明方式是在函数声明后加上 = 0。纯虚函数告诉编译器,派生类必须提供自己的实现来满足接口规范。

示例:

#include <iostream>// 抽象基类 Shape
class Shape {
public:// 纯虚函数 area(),表示该函数在基类中没有实现virtual double area() const = 0;// 普通成员函数,可在基类中提供默认实现void printArea() const {std::cout << "Area: " << area() << std::endl;}// 虚析构函数,确保正确释放资源virtual ~Shape() {}
};// 派生类 Circle
class Circle : public Shape {
private:double radius;public:// 实现纯虚函数 area()double area() const override {return 3.14159 * radius * radius;}// 构造函数Circle(double r) : radius(r) {}
};// 派生类 Rectangle
class Rectangle : public Shape {
private:double width;double height;public:// 实现纯虚函数 area()double area() const override {return width * height;}// 构造函数Rectangle(double w, double h) : width(w), height(h) {}
};int main() {// 创建 Circle 对象和 Rectangle 对象Circle circle(5.0);Rectangle rectangle(4.0, 6.0);// 使用基类指针操作派生类对象,体现多态性Shape* shape1 = &circle;Shape* shape2 = &rectangle;// 调用基类的成员函数,实际调用派生类的实现shape1->printArea(); // 输出: Area: 78.5398shape2->printArea(); // 输出: Area: 24return 0;
}

这个示例中,Shape 是一个抽象基类,它包含一个纯虚函数 area()。Circle 和 Rectangle 分别是 Shape 的两个派生类,它们都必须实现 area() 函数才能被实例化。通过使用抽象基类和纯虚函数,我们实现了多态性,让不同类型的对象都可以以统一的接口进行操作。

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

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

相关文章

SpringBoot-集成Elasticsearch

依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId…

微服务之qiankun主项目+子项目搭建

主项目使用history&#xff0c;子项目使用hash模式 1. 下载安装"qiankun": "^2.10.13"2. 手动调用qiankun,使用vue脚手架搭建的项目1. 主项目配置&#xff08;我使用的是手动调用乾坤&#xff0c;在指定页面显示内容&#xff09;1. 要使用的页面中引入乾坤…

MyBatis概述

三层架构 表现层&#xff1a;直接和前端交互&#xff0c;接受AJAX请求&#xff0c;返回json数据业务层&#xff1a;一是处理前端的请求&#xff0c;二是返回持久层获取的数据持久层(数据访问层)&#xff1a;直接操作数据库&#xff0c;完成CRUD&#xff0c;返回数据给业务层 …

李沐动手学习深度学习——3.2练习

以下是个人理解&#xff0c;希望进行讨论求解。 练习 1. 如果我们将权重初始化为零&#xff0c;会发生什么。算法仍然有效吗&#xff1f; 根据SGD算法公式如上&#xff0c;第一次迭代的值可知w只与b相关&#xff0c;而对于b的迭代更新&#xff0c;只是与b的初始值相关&#x…

docker中hyperf项目配置虚拟域名

在使用hyperf框架时&#xff0c;直接用了docker环境进行开发 下载镜像运行容器 docker run --name hyperf -v /data/project:/data/project -p 9501:9501 -itd -w /data/project --privileged -u root --entrypoint /bin/sh 镜像ID配置docker-compose.yml version: "3.…

也谈AIGC和ChatGPT的区别?

AIGC 和 ChatGPT 的区别 定义 AIGC (人工智能生成内容)&#xff1a;一种人工智能技术&#xff0c;用于生成类似人类的文本、图像、音频和视频等内容。ChatGPT&#xff1a;OpenAI 开发的大型语言模型&#xff0c;是 AIGC 的一种具体实现。 目的 AIGC&#xff1a;广泛用于内容…

亚马逊自养号测评:如何安全搭建环境,有效规避风险

要在亚马逊上进行自养号测评&#xff0c;构建一个真实的国外环境至关重要。这包括模拟国外的服务器、IP地址、浏览器环境&#xff0c;甚至支付方式&#xff0c;以创建一个完整的国际操作环境。这样的环境能让我们自由注册、养号并下单&#xff0c;确保所有操作均符合国际规范。…

Gin 框架简单上手

引言 Gin 是一个基于 Go 语言的 Web 框架&#xff0c;旨在提供高性能和高效的方式来构建 Web 应用程序。它简单易用&#xff0c;同时又提供了丰富的功能和灵活的扩展性。本文将带你深入学习 Gin 框架&#xff0c;从安装开始&#xff0c;逐步深入探索其各项功能&#xff0c;包括…

企业级指针仪表读数YOLOV8NANO

企业级指针仪表读数&#xff0c;采用YOLOV8NANO训练&#xff0c;检测表盘和表芯&#xff0c;得到PT模型&#xff0c;然后转换ONNX&#xff0c;让OPENCV调用。然后提取表芯区域&#xff0c;通过极坐标转换为直角坐标&#xff0c;再通过检测指针和刻度&#xff0c;换算成比例&…

Chapter 8 - 19. Congestion Management in TCP Storage Networks

Queue Depth Monitoring and Microburst Detection Queue depth monitoring and microburst detection capture the events that may cause congestion at a lower granularity but are unnoticed by other means due to long polling intervals. 队列深度监控和微爆检测可捕捉…

Ubuntu 安装 Android Studio

一. 步骤 通过以上步骤&#xff0c;可以在 Ubuntu 上成功安装 Android Studio&#xff0c;并开始进行 Android 应用程序的开发。 打开终端&#xff08;Terminal&#xff09;。 首先&#xff0c;确保你已经安装了 Java 开发工具包&#xff08;JDK&#xff09;。Android Studio …

notejs+nvm+angular+typescript.js环境 Hertzbeat 配置

D:\Program Files\nodejs\ D:\Users\Administrator\AppData\Roaming\nvm nvm命令提示 nvm arch&#xff1a;显示node是运行在32位还是64位。 nvm install <version> [arch] &#xff1a;安装node&#xff0c; version是特定版本也可以是最新稳定版本latest。 可选参…

前端-BOM和DOM的区别和用法

首先上图&#xff0c;这是整个JAVASCRIPTD 结构&#xff0c;因此我们可以得出一个关系等式 JavaScript ECMAscript BOM DOMECMAscript&#xff1a; 是一种由 ECMA国际&#xff08;前身为欧洲计算机制造商协会&#xff09;通过 ECMA-262 标准化的脚本程序设计语言&#xff0…

二分图---染色法(判断二分图),匈牙利算法(二分图的最大匹配) //概念,应用场景,判定证明,算法思路,示例

目录 二分图概念 二分图应用场景 如何判定一个图是否可以划分成二分图 证明 染色法 原理步骤 时间复杂度 算法思路 例子 匈牙利算法 概念 匈牙利使用算法前提,场景 时间复杂度 算法思路 例子 二分图概念 二分图是图论中的一个重要概念&#xff0c;指的是一个图的…

如何将算法部署于云平台

算法部署&#xff1a;指将开发完成的算法模型应用到实际的生产环境中的过程。通常包括将算法模型转换为可以在特定硬件和软件环境中运行的服务或应用程序&#xff0c;并使其能够接收输入数据&#xff0c;处理这些数据&#xff0c;并返回预测或分析结果。 要将一个离线的强化学…

Java四大引用类型

四大引用类型 从JDK 1.2版本开始&#xff0c;对象的引用被划分为4种级别&#xff0c;从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为&#xff1a;强引用、软引用、弱引用和虚引用 不同的引用类型&#xff0c;主要体现的是对象不同的可达性&#xff08;r…

【vue3学习笔记】Suspense组件;vue3中的其它改变

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 课程 P167节 《Suspense组件》笔记 想要学习suspense&#xff0c;先来了解静态组件与异步组件。 静态引入与异步引入&#xff1a; 在network中将网速调慢&#xff0c;观察在静态引入和异步引入模式下&#xff0c;两个组件的加载…

CI/CD笔记.Gitlab系列.`gitlab-ci.yml`中的头部关键字

CI/CD笔记.Gitlab系列 gitlab-ci.yml中的头部关键字 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.ne…

【MySQL】主从同步原理、分库分表

主从同步原理 1. 主从同步原理 MySQL 经常先把命令拷入硬盘的日志&#xff0c;再执行日志的命令&#xff0c;这样的好处&#xff1a; 日志的位置固定&#xff0c;拷入硬盘的开销不大&#xff1b;将命令先准备好&#xff0c;而不是边读边执行&#xff0c;性能更好&#xff0c;…

PyTorch深度学习工具箱整理总结

一、pytorch 简介 Pytorch是torch的python版本&#xff0c;是由Facebook开源的神经网络框架&#xff0c;专门针对 GPU 加速的深度神经网络&#xff08;DNN&#xff09;编程。Torch 是一个经典的对多维矩阵数据进行操作的张量&#xff08;tensor &#xff09;库&#xff0c;在机…