当前位置: 首页 > news >正文

C++ 抽象类和接口 详解

目录

  • 0 引言
  • 1 抽象类
  • 2 接口
    • 2.1 Java与C++接口的区别

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:C++专栏
  • 💥 标题:C++ 抽象类和接口 详解
  • ❣️ 寄语:书到用时方恨少,事非经过不知难!
  • 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正

0 引言

随着编程的深入,总是会听到不少抽象类,接口等词汇。但是其实很多有都在混淆概念,甚至是乱用这些定义。接下来就和我一起探讨一下C++中的抽象类和接口的区别,以及拓展一下 C++ 和 Java 的区别。

1 抽象类

在C++中,抽象类(Abstract Class)是包含至少一个纯虚函数的类。抽象类不能被实例化,只能被用作其他类的基类。纯虚函数是一种在基类中声明但没有提供实际实现的虚函数,它的存在要求任何继承自这个基类的派生类都必须提供实际的实现(如果不实现,那基类仍然是抽象类)。这样的设计允许抽象类提供一个接口,而具体的实现则由派生类完成。

在C++中,定义一个抽象类的典型方式如下:

class AbstractClass {
public:// 纯虚函数,使得AbstractClass成为抽象类virtual void pureVirtualFunction() = 0;// 虚析构函数(防止派生类析构时,不调用派生类的析构函数)virtual ~AbstractClass() {}// 普通成员函数void concreteFunction() {// 可以包含具体实现// 但通常抽象类中也包含一些纯虚函数,以强制派生类提供实现}// 普通成员变量int data;
};

在这个例子中,pureVirtualFunction是一个纯虚函数,因此AbstractClass就成为了抽象类。由于抽象类不能被实例化,你不能创建AbstractClass的对象。它主要用于作为其他类的基类,要求派生类必须提供纯虚函数的实际实现。

具体的派生类可以这样实现:

class ConcreteClass : public AbstractClass {
public:// 实现纯虚函数void pureVirtualFunction() override {// 具体的实现}
};

注意,在派生类中必须提供对抽象类中纯虚函数的实现,否则派生类也会变成抽象类,无法被实例化。

2 接口

在C++中接口就是一种特殊的抽象类,接口中只包括纯虚函数。

在C++中,与一些其他编程语言(如Java和C#)不同,C++没有显式的接口关键字。然而,C++中可以通过抽象类和纯虚函数来实现接口的概念。

在C++中,接口通常是通过抽象类来定义的,该抽象类包含纯虚函数(没有实现),而派生类则负责提供这些纯虚函数的具体实现。这种方式类似于其他语言中的接口定义。

下面是一个使用抽象类和纯虚函数实现接口的简单示例:

#include <iostream>// 定义接口(抽象类)
class Interface {
public:// 纯虚函数,相当于接口中的方法声明virtual void doSomething() = 0;
};// 不能在接口中包含普通成员函数
// 下面的代码会导致编译错误
/*
class Interface {
public:virtual void doSomething() = 0;void commonFunction() {std::cout << "Common function in Interface." << std::endl;}
};
*/// 实现接口的具体类
class ConcreteClass : public Interface {
public:// 提供接口中纯虚函数的具体实现void doSomething() override {std::cout << "Doing something in ConcreteClass." << std::endl;}
};int main() {// 通过接口指针调用实现类的方法Interface* obj = new ConcreteClass();obj->doSomething();delete obj;return 0;
}

2.1 Java与C++接口的区别

Java和C++在接口(interface)方面存在一些显著的区别。了解这些区别对于使用这两种语言进行编程是很重要的。以下是主要的区别点:

  1. 定义和用途:

    • Java接口:Java中的接口是一个完全抽象的类,只能包含抽象方法和常量。接口用于声明一组方法,然后由其他类实现。Java接口是实现多继承的一种方式。
    • C++接口:C++没有内置的接口关键字,但可以通过创建纯虚函数(pure virtual functions)的抽象类来模拟接口。这些类不能被实例化,只能被其他类继承。
  2. 实现方法:

    • Java:在Java中,类可以实现多个接口。使用interface关键字来实现接口,并且必须实现接口中的所有方法。
    • C++:C++中的类通过继承抽象类来实现接口,并且必须实现所有的纯虚函数。C++支持多重继承,因此一个类可以继承多个抽象类。
  3. 默认方法:

    • Java:从Java 8开始,接口可以包含默认方法(default methods)。这些方法不是抽象的,可以有自己的实现。这允许在不影响实现该接口的类的情况下添加新功能。
    • C++:C++的抽象类可以包含已经实现的成员函数,这在某种程度上类似于Java的默认方法。
  4. 属性:

    • Java:Java接口中可以声明常量,但不能包含实例字段。所有定义在接口中的变量默认都是public static final的。
    • C++:C++中的抽象类可以包含成员变量和常量。
  5. 多重继承和菱形问题(Diamond Problem):

    • Java:由于Java不支持从多个类继承,因此使用接口来实现多重继承。Java接口不会导致菱形问题,因为它们不具备实现继承。
    • C++:C++支持从多个类继承,但这可能导致菱形问题。当两个父类都继承自同一个祖先类时,子类可能会从每个父类继承相同的祖先类的两个副本。

这些差异反映了Java和C++设计哲学的不同:Java更注重简洁和安全,而C++提供了更高的灵活性和控制权,但也带来了更复杂的语言特性和潜在的错误风险。

// 定义一个接口
interface Vehicle {void drive();int getNumberOfWheels();
}// 一个类实现接口
class Car implements Vehicle {public void drive() {// 实现drive方法的具体逻辑}public int getNumberOfWheels() {// 返回轮子数量return 4;}
}

相关文章:

C++ 抽象类和接口 详解

目录 0 引言1 抽象类2 接口2.1 Java与C接口的区别 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;C专栏&#x1f4a5; 标题&#xff1a;C 抽象类和接口 详解❣️ 寄语&#xff1a;书到用时方恨少&#xff0c;事非经过不知难&#xff01;&#x1f…...

【Linux】awk 使用

awk 输出 // 打印所有列 $ awk {print $0} file // 打印第一列 $ awk {print $1} file // 打印第一和第三列 $ awk {print $1, $3} file // 打印第三列和第一列&#xff0c;注意先后顺序 $ cat file | awk {print $3, $1} …...

LeetCode力扣每日一题(Java):9、回文数

一、题目 二、解题思路 1、我的思路 当x<0时&#xff0c;x一定不是回文数&#xff0c;直接返回false 当x>0且x<10时&#xff0c;x一定是回文数&#xff0c;直接返回true x>10时&#xff0c;先将x转为字符串。将数字转成字符串方法挺多的&#xff0c;以下是&…...

WPF前端实现人脸扫描动画效果

前言 本章实现的效果主要通过OpacityMask与LinearGradientBrush(径向渐变) 的组合应用来实现。最终实现效果如下: LinearGradientBrush线性渐变画刷 LinearGradientBrush其实很简单,我们只需要关注5个属性,使用这5个属性你就可以完成这个画刷几乎所有的变化。 属性介…...

更改AndroidStudio模拟器位置

C盘何等的珍贵&#xff0c;可是好多工具&#xff0c;软件非得默认安装在C盘。。导致C盘越来越紧张。。 在日常使用过程中&#xff0c;安装任何软件都会将其安装到非系统盘下&#xff0c;Android模拟器也不能例外。保护好C盘也是日常一个良好的习惯。 Android AVD默认路径&…...

Dash 协议介绍

<?xml version"1.0" encoding"utf-8"?> <MPD xmlns"urn:mpeg:dash:schema:mpd:2011" minBufferTime"PT1.5S" type"static" mediaPresentationDuration"PT0H1M0.3S" maxSegmentDuration"PT0H0M2.0…...

RabbitMQ的消息发送和接收机制

所有 MQ 产品从模型抽象上来说都是一样的过程&#xff1a; 消费者&#xff08;consumer&#xff09;订阅某个队列。生产者&#xff08;producer&#xff09;创建消息&#xff0c;然后发布到队列&#xff08;queue&#xff09;中&#xff0c;最后将消息发送到监听的消费者。 上…...

记录111

在两台 RHEL 8 服务器上搭建 PostgreSQL 和 pgpool-II 环境涉及到安装 PostgreSQL、配置流复制&#xff08;Streaming Replication&#xff09;以及安装和配置 pgpool-II。以下是详细的步骤&#xff1a; ### 准备工作 1. **获取服务器**&#xff1a;确保你有两台运行 RHEL 8 的…...

振动和震动的区别?

问题描述&#xff1a;振动和震动的区别&#xff1f; 问题解决&#xff1a; 震动&#xff08;Oscillation&#xff09;&#xff1a; 特点&#xff1a; 随机的、突发的、不经常的、无规律的运动。例子&#xff1a; 地壳震动、消息震动全国&#xff0c;强调的是运动的力度或幅度&…...

3DMM模型

目录 BFMBFM_200901_MorphableModel.matexp_pca.bintopology_info.npyexp_info.npy BFM BFM_2009 01_MorphableModel.mat from scipy.io import loadmat original_BFM loadmat("01_MorphableModel.mat") # dict_keys: [__header__, __version__, __globals__, # …...

Python 3 使用 write()、writelines() 函数写入文件

1 使用 write() 函数&#xff0c;将字符串&#xff08;或字节串&#xff0c;仅适用写入二进制文件中&#xff09;写入文件中。 with open(example.txt,w,encodingutf-8) as f:f.write(春夜喜雨\n)f.write(杜甫 [唐代]\n)f.write(好雨知时节&#xff0c;当春乃发生。\n)f.write(…...

鸿蒙(HarmonyOS)应用开发——管理组件状态

状态管理 在应用中&#xff0c;界面通常都是动态的。 #mermaid-svg-DrPNsglFkyLqn7Lw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-DrPNsglFkyLqn7Lw .error-icon{fill:#552222;}#mermaid-svg-DrPNsglFkyLqn7Lw …...

倚天屠龙:Github Copilot vs Cursor

武林至尊&#xff0c;宝刀屠龙。号令天下&#xff0c;莫敢不从。倚天不出&#xff0c;谁与争锋&#xff01; 作为开发人员吃饭的家伙&#xff0c;一款好的开发工具对开发人员的帮助是无法估量的。还记得在学校读书的时候&#xff0c;当时流行CS架构的RAD&#xff0c;Delphi和V…...

【web安全】RCE漏洞原理

前言 菜某的笔记总结&#xff0c;如有错误请指正。 RCE漏洞介绍 简而言之&#xff0c;就是代码中使用了可以把字符串当做代码执行的函数&#xff0c;但是又没有对用户的输入内容做到充分的过滤&#xff0c;导致可以被远程执行一些命令。 RCE漏洞的分类 RCE漏洞分为代码执行…...

EI论文复现:基于组合双向拍卖的共享储能机制研究程序代码!

本程序参考EI期刊论文《基于组合双向拍卖的共享储能机制研究》&#xff0c;文中的组合双向拍卖交易机制较为新颖&#xff0c;本质上属于博弈范畴&#xff0c;共享储能是目前的研究热点&#xff0c;牵涉到共享储能参与者的投标策略和收益函数&#xff0c;文中所提模型可为电力市…...

ThinkPHP 5 中,你可以使用定时任务调度器(TaskScheduler)来执行其他定时任务

在 ThinkPHP 5 中&#xff0c;你可以使用定时任务调度器&#xff08;TaskScheduler&#xff09;来执行其他定时任务。以下是一个示例代码&#xff0c;演示如何在一个定时任务中执行另一个定时任务&#xff1a; 首先&#xff0c;你需要创建一个继承自 think\console\Command 的…...

mysql:免费的GUI客户端工具推荐并介绍常用的操作

给大家推荐几个常用的 mysql 数据库客户端 sequel-pro sequel-ace 官网下载地址 免费 sequel-ace 可以理解为 Sequel Pro 的升级版&#xff0c;由于Sequel Pro官方不维护了&#xff0c;特别是对 MySQL 8.0 支持不好&#xff0c;所以现在由社区维护了新分支 sequel-ace&#x…...

[Unity数据管理]自定义菜单创建Unity内部数据表(ScriptableObject)

Unity 在开发的时候如果数据量比较大&#xff0c;或者一部分数据需要存在云端&#xff0c;那么就需要一些数据库 轻量型到大型的包括&#xff1a; 数组-内存存储读取 列表-内存存储读取 List<T> tList new List<T>(); XML-硬盘存储读取 JSON-硬盘存储读取 …...

使用JAVA语言写一个排队叫号的小程序

以下是一个简单的排队叫号的小程序&#xff0c;使用JAVA语言实现。 import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class NumberingSystem {public static void main(String[] args) {Queue<String> queue new LinkedList<…...

openGauss学习笔记-140 openGauss 数据库运维-例行维护-例行维护表

文章目录 openGauss学习笔记-140 openGauss 数据库运维-例行维护-例行维护表140.1 相关概念140.2 操作步骤140.3 维护建议 openGauss学习笔记-140 openGauss 数据库运维-例行维护-例行维护表 为了保证数据库的有效运行&#xff0c;数据库必须在插入/删除操作后&#xff0c;基于…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...