C++抽象基类定义与使用

在 C++ 中,抽象基类(Abstract Base Class, ABC) 是一种特殊的类,用于定义接口规范和约束派生类的行为。它通过纯虚函数(Pure Virtual Function)强制要求派生类实现特定功能,自身不能被实例化。以下是抽象基类的核心概念和使用方法:


1. 定义抽象基类

抽象基类必须包含至少一个 纯虚函数,语法为在虚函数声明后添加 = 0

class Shape {
public:// 纯虚函数:没有实现,必须由派生类覆盖virtual double area() const = 0;virtual double perimeter() const = 0;// 普通虚函数(可选,可提供默认实现)virtual void printInfo() const {std::cout << "This is a shape." << std::endl;}// 虚析构函数(必须!确保正确释放资源)virtual ~Shape() = default;
};

2. 抽象基类的特性

  • 不可实例化:抽象基类不能直接创建对象。
    Shape s;  // 错误:无法实例化抽象类
    
  • 强制派生类实现接口:派生类必须覆盖所有纯虚函数,否则仍是抽象类。
  • 支持多态:通过基类指针或引用操作派生类对象。

3. 派生类实现示例

class Circle : public Shape {
private:double radius;public:Circle(double r) : radius(r) {}// 必须实现基类的纯虚函数double area() const override {return 3.14159 * radius * radius;}double perimeter() const override {return 2 * 3.14159 * radius;}// 可覆盖基类的普通虚函数(可选)void printInfo() const override {std::cout << "This is a circle." << std::endl;}
};

4. 使用抽象基类实现多态

int main() {Shape* shape = new Circle(5.0);// 调用派生类实现的函数std::cout << "Area: " << shape->area() << std::endl;      // 输出圆的面积std::cout << "Perimeter: " << shape->perimeter() << std::endl;shape->printInfo();  // 调用派生类的 printInfo()delete shape;return 0;
}

5. 关键注意事项

  • 虚析构函数:基类的析构函数必须声明为虚函数,确保正确释放派生类资源。
  • 接口规范:抽象基类用于定义通用接口,强制派生类遵守统一行为。
  • 纯虚函数的默认实现(C++11 起):
    virtual void someFunction() const = 0 { /* 默认实现 */ }
    
    派生类可通过 BaseClass::someFunction() 调用默认实现。

6. 抽象基类 vs 接口

  • 抽象基类:可以包含数据成员、普通成员函数和纯虚函数。
  • 接口(类似 Java):仅包含纯虚函数(无数据成员和普通函数),但 C++ 中通过纯抽象类模拟:
    class ISerializable {
    public:virtual void serialize() const = 0;virtual void deserialize() = 0;virtual ~ISerializable() = default;
    };
    

总结

抽象基类是 C++ 实现多态和接口规范的核心工具,通过纯虚函数强制派生类实现特定功能,确保代码的一致性和可扩展性。它在设计模式(如工厂模式、策略模式)和大型项目架构中广泛应用。

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

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

相关文章

用selenium4 webdriver + java 搭建并完成第一个自动化测试脚本

自动化测试任务&#xff1a; 百度搜索自己的姓名。点击第一个链接&#xff08;或者第二个&#xff09;&#xff0c;在新的页面上&#xff0c;添加断言&#xff0c;验证你的名字是否存在。 实验资料百度网盘下载路径&#xff1a; 链接: https://pan.baidu.com/s/1nVlHX_ivres…

LLM大模型中的基础数学工具—— 约束优化

Q26: 推导拉格朗日乘子法 的 KKT 条件 拉格朗日乘子法与 KKT 条件是啥&#xff1f; 拉格朗日乘子法是解决约束优化问题的利器。比如&#xff0c;想最小化函数 &#xff0c;同时满足约束 &#xff0c;就构造拉格朗日函数 &#xff08; 是乘子&#xff09;。KKT 条件是解这类问…

net+MySQL中小民营企业安全生产管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;中小民营企业安全生产管理系统利用计算机网络实现信息化管理&#xff0c;使企业的中小民营企业安全生产管理发展和服务水平有显…

论文阅读:2024 arxiv AI Safety in Generative AI Large Language Models: A Survey

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Safety in Generative AI Large Language Models: A Survey 生成式人工智能大型语言模型中的人工智能安全性:一项调查 https://arxiv.org/pdf/2407.18369 https://www.doubao.com…

【MySQL数据库】表的约束

目录 1&#xff0c;空属性 2&#xff0c;默认值 3&#xff0c;列描述 4&#xff0c;zerofill 5&#xff0c;主键primary key 6&#xff0c;自增长auto_increment 7&#xff0c;唯一键unique 8&#xff0c;外键foreign key 在MySQL中&#xff0c;表的约束是指用于插入的…

基于javaweb的SpringBoot校园失物招领系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

多模态大语言模型arxiv论文略读(二十六)

Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ➡️ 论文标题&#xff1a;Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ➡️ 论文作者&#xff1a;Xinpeng Ding,…

“星睿O6” AI PC开发套件评测 - 部署PVE搭建All in One NAS服务器

Radxa O6平台上部署PVE搭建All in One NAS服务器 Radxa O6是一款性能卓越的单板计算机&#xff0c;其强劲的硬件配置和多样化的接口设计&#xff0c;使其成为家庭和小型企业理想的All in One服务器解决方案。值得一提的是&#xff0c;O6原生配备了两个5G网口&#xff0c;便于直…

C++ linux打包运行方案(cmake)

文章目录 背景动态库打包方案动态库转静态库动态库打到软件包中 运行 背景 使用C编写的一个小项目&#xff0c;需要打包成ubuntu下的可执行文件&#xff0c;方便分发给其他ubuntu执行&#xff0c;因为docker镜像方案过于臃肿&#xff0c;所以需要把项目的动态库都打在软件包中…

Linux内核编译(Ubuntu)

实验内容&#xff1a;在系统中下载统一发行版本的版本号较高的内核&#xff0c;编译之后运行自己编译的内核&#xff0c;并使用uname-r命令查看是否运行成功。 实验步骤&#xff1a; 1.查看实验环境和内核版本 图1 实验环境 VMware中虚拟机Ubuntu&#xff08;24.04&#xff…

EdgeGPT - 新版Bing聊天功能逆向工程

本文翻译整理自&#xff1a;https://github.com/acheong08/EdgeGPT 文章目录 一、关于 EdgeGPT相关链接资源关键功能特性 二、安装系统要求安装命令 三、认证配置获取Cookie步骤代码中使用Cookie 四、使用方法1、命令行方式2、Python API方式使用Chatbot类使用Query辅助类 3、…

三网通电玩城平台系统结构与源码工程详解(四):子游戏集成与服务器调度机制全解

本篇将深入讲解三网通电玩城平台中子游戏接入、前后端资源组织方式、服务器调度逻辑、并发接入方案等核心内容&#xff0c;重点覆盖“李逵劈鱼”、“水果玛丽”、“疯狂玛丽”等热门组件&#xff0c;辅以完整代码框架与部署逻辑。 一、子游戏资源目录结构与加载机制 平台采用标…

1.1 AI大模型与Agent的兴起及其对企业数字化转型的推动作用

随着人工智能技术的飞速发展&#xff0c;AI大模型和智能代理&#xff08;Agent&#xff09;的兴起正成为推动企业数字化转型的重要力量。从2017年GPT-1的首次亮相到2025年GPT-4和Qwen 2.5等多模态模型的成熟&#xff0c;AI大模型经历了显著的技术演进&#xff1b;与此同时&…

位运算练习:起床困难综合征(贪心,位运算)(算法竞赛进阶指南学习笔记)

目录 前情提要起床困难综合征&#xff08;贪心&#xff0c;位运算&#xff09; 前情提要 一些基础运算操作用法看看上一篇&#xff1b; 起床困难综合征&#xff08;贪心&#xff0c;位运算&#xff09; 题目原文 [P2114 NOI2014] 起床困难综合症 - 洛谷 思路分析 题目很长…

PowerBi中REMOVEFILTERS怎么使用?

在 Power BI 的 DAX 中&#xff0c;REMOVEFILTERS() 是一个非常重要的函数&#xff0c;常用于取消某个字段或表的筛选上下文&#xff08;Filter Context&#xff09;&#xff0c;从而让你的计算不受切片器&#xff08;Slicer&#xff09;、筛选器或视觉对象的限制。 ✅ 一、REM…

Vue3 实战:打造多功能旅游攻略选项卡页面

在旅游类应用开发中&#xff0c;为用户提供全面、直观的信息展示界面至关重要。本文将分享如何基于 Vue3 Axios 技术栈&#xff0c;实现一个包含攻略、游记、问答三大板块的旅游攻略选项卡页面&#xff0c;从样式设计到交互逻辑&#xff0c;带你深入了解整个开发过程。 项目背…

JavaScript性能优化实战(1):性能优化基础与性能分析工具

性能优化的重要性与业务价值 在当今竞争激烈的互联网环境中,网站和应用的性能已成为用户体验和业务成功的关键因素。研究表明,页面加载时间每增加1秒,转化率可能下降7%,而53%的用户会在页面加载时间超过3秒后放弃访问。这些数据直接揭示了性能优化对业务的巨大影响: 用户…

Unity 脚本使用(二)——UnityEngine.AI——NavMesh

描述 Singleton class 用于访问被烘培好的 NavMesh. 使用NavMesh类可以执行空间查询&#xff08;spatial queries&#xff09;&#xff0c;例如路径查找和可步行性测试。此类还允许您设置特定区域类型的寻路成本&#xff0c;并调整寻路和避免的全局行为。 静态属性&#xff0…

Java 静态内部类面试题与高质量答案合集

本文整理了关于 Java 静态内部类&#xff08;Static Nested Class&#xff09;在面试中的高频问题及标准答案&#xff0c;帮助你理解其底层原理、内存表现以及实际应用。 1. 什么是静态内部类&#xff1f;和普通内部类有什么区别&#xff1f; 答&#xff1a; 静态内部类是定义…

为什么买不到一定阻抗特性曲线的磁环

为什么买不到一定阻抗特性曲线的磁环&#xff1a; 磁环绕不同的圈数&#xff0c;阻抗特性曲线不同&#xff0c;磁环没有类似于磁珠的特定频率和阻抗特性曲线的磁环。 磁环与磁珠的核心区别&#xff1a; 磁珠是一种固定频率阻抗器件&#xff0c;出厂时已通过材料和工艺设计确定…