c++接口

C++ 接口(抽象类) C++接口是一种重要的编程概念,它有助于提高代码的模块化、可重用性和可维护性。本文介绍了C++接口的概念、特点、应用以及与纯虚类的区别,并通过示例展示了如何使用接口。希望本文能帮助读者更好地理解C++接口。 阅读详情

C++ 接口(抽象类)

接口描述了类的行为和功能,而不需要完成类的特定实现。

C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。

如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 "= 0" 来指定的,如下所示:

class Box { public: // 纯虚函数 virtual double getVolume() = 0; private: double length; // 长度 double breadth; // 宽度 double height; // 高度 };

设计抽象类(通常称为 ABC)的目的,是为了给其他类提供一个可以继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用。如果试图实例化一个抽象类的对象,会导致编译错误。

因此,如果一个 ABC 的子类需要被实例化,则必须实现每个纯虚函数,这也意味着 C++ 支持使用 ABC 声明接口。如果没有在派生类中重写纯虚函数,就尝试实例化该类的对象,会导致编译错误。

可用于实例化对象的类被称为具体类。

抽象类的实例

请看下面的实例,基类 Shape 提供了一个接口 getArea(),在两个派生类 Rectangle 和 Triangle 中分别实现了 getArea():

实例

#include <iostream> using namespace std; // 基类 class Shape { public: // 提供接口框架的纯虚函数 virtual int getArea() = 0; void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // 派生类 class Rectangle: public Shape { public: int getArea() { return (width * height); } }; class Triangle: public Shape { public: int getArea() { return (width * height)/2; } }; int main(void) { Rectangle Rect; Triangle Tri; Rect.setWidth(5); Rect.setHeight(7); // 输出对象的面积 cout << "Total Rectangle area: " << Rect.getArea() << endl; Tri.setWidth(5); Tri.setHeight(7); // 输出对象的面积 cout << "Total Triangle area: " << Tri.getArea() << endl; return 0; }

当上面的代码被编译和执行时,它会产生下列结果:

Total Rectangle area: 35
Total Triangle area: 17

从上面的实例中,我们可以看到一个抽象类是如何定义一个接口 getArea(),两个派生类是如何通过不同的计算面积的算法来实现这个相同的函数。

设计策略

面向对象的系统可能会使用一个抽象基类为所有的外部应用程序提供一个适当的、通用的、标准化的接口。然后,派生类通过继承抽象基类,就把所有类似的操作都继承下来。

外部应用程序提供的功能(即公有函数)在抽象基类中是以纯虚函数的形式存在的。这些纯虚函数在相应的派生类中被实现。

这个架构也使得新的应用程序可以很容易地被添加到系统中,即使是在系统被定义之后依然可以如此。

笔记:

1.

以下这段是转载的,非常经典:

定义一个函数为虚函数,不代表函数为不被实现的函数。

定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。

定义一个函数为纯虚函数,才代表函数没有被实现。

定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。

C++零基础教程(抽象类和接口) 本篇文章来讲解抽象类和接口的概念,抽象类和接口都需要依靠我们之前讲解的虚函数来实现,那么我们就来看看如何使用虚函数来实现抽象类和接口吧。本篇文章就讲解到这里,下篇文章我们继续讲解。 阅读详情

相关推荐

C++接口定义及实现举例

一、接口的定义   有时候,我们得提供一些接口给别人使用。接口的作用,是提供一个与其他系统交互的方法。其他系统无需了解你内部细节,并且也无法了解内部细节,只能通过你提供给外部的接口来与你进行通信。根据c++的特点,我们可以采用纯虚函数的方式来实现。这样做的好处是能够实现封装和多态。现举一实例,供大家参考。(不想做过多说明,大家一看应该能够明白) Class IPerson { public: IPerson(){}; virtual ~IPerson()=0;//注意,好要定义此虚析构函数,能够避免其实现不能正常调用析构函数的问题 //提供给外面使用的接口一般采用纯虚函数 vi

C++ 中的接口(Interface)

在 C++ 中,一个类被称为纯接口(Pure Interface)只有纯虚函数和静态函数(析构函数除外)类中只能包含纯虚函数(= 0)和静态函数,不允许有普通成员函数的具体实现。纯虚函数定义了接口的契约,要求派生类必须实现。静态函数(static)可以提供与类相关的工具函数,但不依赖实例。没有非静态数据成员接口类不得包含任何非静态数据成员(如int x;),因为数据成员会引入状态,而接口只应定义行为。没有定义任何构造函数,或构造函数无参数且为protected。

cxyhjl的博客 3037

保姆级教程:用ROS2 Humble和激光雷达,5分钟搞定机器人避障(附Python代码)

本文提供了一份详细的ROS2 Humble激光雷达避障实战指南,帮助开发者快速实现机器人避障功能。通过环境配置、硬件连接和Python代码实现,5分钟内即可让机器人自主避开障碍物。文章还涵盖了参数调优、常见问题排查及进阶优化技巧,适合机器人开发初学者和进阶用户。

weixin_42528902的博客 343

推荐:现代化C++接口的HDF5库 —— h5cpp

推荐:现代化C++接口的HDF5库 —— h5cpp 项目介绍 在数据存储和管理领域,HDF5是一种强大的二进制格式,几乎可以存储任何类型的数据。然而,直接使用其C API可能会显得复杂且不便。为此,我们引荐一个名为h5cpp的开源项目,它是一个现代C++的HDF5接口封装库。h5cpp旨在提供一种易用且功能全面的现代C++接口,以充分利用HDF5的所有潜力。 项目技术分析 h5cpp的设计目标是...

gitblog_00057的博客 1338

matlab内读取文件目录时斜杠和反斜杠的使用

@matlab内读取文件目录时斜杠和反斜杠的使用TOC matlab内读取文件目录时,斜杠和反斜杠的使用 最近被斜杠和反斜杠弄晕了,于是总结了一下,在此和大家分享一下。 代码 clear; clc; close all; I1= imread('..\zs1.jpg'); %和代码文件夹同目录的图片 (纯反斜杠) I2= imread('../zs2/zs2.j...

weixin_44456694的博客 6575

Java面试题大全(2025版)

== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

2401_89221704的博客 2442

推荐项目:h5cpp - 现代C++的HDF5接口

推荐项目:h5cpp - 现代C++的HDF5接口 在数据存储的世界里,HDF5 是一个重量级选手,以其强大而灵活的数据模型著称。然而,想要充分利用其功能,开发者往往不得不面对不那么“现代”的C API。这一切,随着 h5cpp 的出现而改变了。 项目介绍 h5cpp —— 一个旨在提供现代C++风格封装的HDF5库。它不仅仅是一个简单的绑定或包装器,而是为开发人员打开了一扇通往HDF5高级特性的...

gitblog_00336的博客 666

hwasan实例分析踩内存之七:CamX进程chifeature2base怪异的Cause: use-after-free

摘要:本文分析了高通camx进程中的指针异常crash问题,通过构建hwasan版本确认存在内存踩踏现象。日志显示为"use-after-free"类型错误,具体为线程T175672在已释放内存区域执行写入操作。堆栈分析表明ChiFeature2Base::PipelineDestroyCb()函数访问了已被ChiFeature2Base::DestroyFeatureData()释放的pPipelineData对象。该问题源于多线程环境下内存管理不同步,导致释放后仍被引用。解决方案通过

1078

cpp2python:自动化C++到Python接口转换,提升多语言开发效率

在混合语言开发中,C++与Python的互操作是常见需求,涉及类型映射、内存管理和接口绑定等核心原理。通过自动化工具生成绑定代码,能显著降低手动编写C扩展或使用pybind11等库的技术门槛,提升开发效率。这类技术在多语言集成、性能优化和代码复用场景中具有重要价值,尤其适用于算法库封装、系统模块暴露等工程实践。cpp2python作为典型代表,基于头文件解析和代码生成,实现了从C++接口到Python模块的平滑转换,其核心在于自动化处理类型映射和生成pybind11代码,为开发者提供了高效的“桥梁建造”流水

weixin_30536861的博客 335

2025华为杯第二十二届中国研究生数学建模竞赛D题:低空湍流监测及最优航路规划 - 完整解题分析+完整MATLAB源码!(上篇)

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 2591

玩转企业微信群机器人:一份超详细的Webhook消息推送指南

企业微信群机器人是一个连接内部协作与外部服务的强大桥梁。通过灵活运用本文介绍的各种消息类型,你可以构建出丰富多彩、信息明确的自动化通知系统,极大地提升团队沟通效率。现在,就动手试试,将你的第一个机器人集成到工作流中吧!如果你有任何有趣的机器人应用场景或遇到了问题,欢迎在评论区留言交流!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3981

caffe之classification.cpp 接口源码解读

第一次写博客,平时我学习东西一般都是从博客上看的,受益匪浅,也觉得养成个写博客的习惯是对自己知识的巩固是极好的,当然如果能帮到别人,那就再好不过了~       我们知道Caffe本身就是用c++写的,在用caffe训练model时,可以使用Python、Matlab、C++三种接口去训练,然而它本身不提供可视化,所以也只能借助其它的库或者接口,绝大部分就是用python和matlab去可视化,

花泽 2230

华为OD机试真题 新系统2026-04-01 C++ 实现【勇攀数字高峰】

请你在给定的数字地形图中寻找登山路径,数字代表当前位置的海拔高度,要求从最低海拔出发,不断攀登,最终到达最高山峰。你需要寻找所有满足条件的登山路径。地图已经保证最低海拔和最高山峰都只有一个。

MISAYAONE的博客 384

C++抽象编程——接口(1)——.h文件与.cpp文件的建立

在我们之前写过的程序中,都有这一句:#include <XXX>其中的< XXX >就是一个库。那么这里面到底包含了什么呢?这又是怎么实现的呢?接口与实现(Interfaces and implementations)当我们在C++中定义库时,需要提供两个部分。首先,我们必须定义接口(interface),它提供了客户端使用库所需的信息,但我们要注意留出关于库如何工作的详细信息(即注释)。 其次,要

redAnt的博客 3870

【深度学习新浪潮】算力上太空:NVIDIA Space-1 Vera Rubin Module 深度技术解析

NVIDIA Space-1 Vera Rubin Module 不只是一款芯片模组,它是天地一体化 AI 的基础设施底座。它用成熟的 GPU 架构 + 航天级加固,把地面 AI 生态直接平移到太空。下一个 AI 创新战场,不在云端,而在轨道。在轨 LLM星上多模态实时处理卫星自主组网与分布式推理太空算力成为云计算的一级节点参考资料NVIDIA 官方博客:NVIDIA 推出太空计算,将 AI 送入太空轨道GTC 2026 黄仁勋主题演讲。

专注:太空算力、AI infra、异构调度、大模型成本工程 1128

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++核心准则SF.1:如果你的项目没有正在遵从的其他习惯,为代码文件使用.cpp后缀,为接口文件使用.h后缀

SF.1: Use a.cppsuffix for code files and.hfor interface files if your project doesn't already follow another convention SF.1:如果你的项目没有正在遵从的其他习惯,为代码文件使用.cpp后缀,为接口文件使用.h后缀 Reason(原因) It's a longstanding convention. But consistency is more important,...

面向对象思考 690

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ZXing-CPP项目中Python接口的TryHarder选项解析

ZXing-CPP是一个开源的条形码/二维码识别库的C++实现版本。在项目开发过程中,有用户发现Python接口与其他语言接口在TryHarder选项上的实现存在差异。本文将深入分析这一设计决策的技术背景和实际应用场景。 ## TryHarder选项的技术原理 TryHarder是ZXing解码器中的一个重要参数,它控制着解码器在识别条形码时的扫描策略。当启用时,解码器会: 1. 采用更密集...

gitblog_07308的博客 517

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Redis-CPP通用接口

作为返回值的,这是因为第二个版本可以接受一个初始化列表,可以接收多个。重点讲解每个命令的用法和参数,具体用法可以学习这篇文章。操作来检测连通性,如果连通成功,则会返回一个字符串。,就是把另一个迭代器,赋值给这个插入迭代器。需要使用Redis客户端时,需要包含相应的头文件。客户端和服务端是在同一台主机上,所以指定的是。,如果是不同主机,则需要写对应主机的IP。里面,接着需要指定IP地址和端口号。,可以表示“非法值/无效值”,如果查询到。,表明这是只读 的,不能修改。是一个插入迭代器,用于获取符合条件的。

weixin_71964451的博客 812

C++接口封装实例

基础知识: VS2017配置: mydll.cpp代码如下: //导出报价结果 __declspec(dllexport) float result(int a,int b, float c) { float d;//税费 float sum;//开票后金额 sum = (a + b)*(1 + c);//开票金额 d = sum / ...

一行一生 1536

C++的接口

c++ 的接口类到底是干什么用的?什么叫接口? 打一个比方如抽象一个类"人":class people。人有一些必须要做的事,比如:吃饭、呼吸。 但是每个人吃饭又不一样,比如:用筷子吃(中国人)、用刀叉(欧美人)、用手抓(印度人)。 那么你如果不把“人”(people)这个类做为一个接口(抽象类)。吃就至少要写3个“吃”的重载方法。但一个中国人可能永远也用不到用刀叉吃饭、用手抓饭这样的方法。这就造...

elisabeth1994的博客 9733

c++ h cpp文件如何关联_C++核心准则SF.5: .cpp文件必须包含定义它接口的.h文件

SF.5: A.cppfile must include the.hfile(s) that defines its interfaceSF.5: .cpp文件必须包含定义它接口的.h文件Reason(原因)This enables the compiler to do an early consistency check.这样可以让编译器尽早进行一致性检查。Example, b...

weixin_39779537的博客 137

UE4 C++ 创建一个接口

接口的创建不需要通过编辑器,可以直接使用IDE将接口的.h和.cpp创建到项目目录下的Source文件夹下的工程名文件夹里。Source-&gt;项目名文件夹。 这里创建一个简单的空的接口MyInterface MyInterface.h #pragma once #include "MyInterface.generated.h" UINTERFACE() class MyProjectNa...

Fighter 2803

bug记录——C语言调用C++函数接口

结论 当C语言 需要调用C++函数接口(比如func.h,func.cpp)时,func.h中不能出现c++特有的class定义或头文件包含。即:关于class的定义或含有class的头文件包含必须放在源文件中(如func.cpp中),不能放在头文件(func.h,无论是extern “C” 里还是exter "C"外)中 一个小bug卡了好多天。。特此记录。。。 证明 main.c代码如下: #...

wyy_csdn博客 430

Java 接口 vs C++ 纯虚函数 vs .h/.cpp:一文彻底讲清两个“完全不同的世界”

摘要:Java接口与C++实现存在本质区别,主要分为设计维度和工程维度。设计上,Java接口对应C++的纯虚函数+抽象类,用于定义规范;工程上,C++的.h/.cpp文件是代码组织和编译控制工具,与接口机制无关。两者常被混淆是因为表面结构相似,但Java接口属于设计抽象,而C++文件分离是物理实现。正确认知需区分:纯虚函数实现接口功能,文件分离管理编译依赖。从Java转C++需同时掌握面向对象设计思维和编译工程思维。核心结论:Java接口≈C++抽象类,.h/.cpp≠接口机制。

Mark Wu 的博客 565

Redis:cpp.redis++通用接口

讲解Redis的C++客户端redis++

博客网站 https://async-area.com 1998
上一篇: c++数据封装
下一篇: 【无标题】
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值