【Example】C++ 接口概念讲解及例子演示

C++ 和 Java 不同的是,C++ 没有 interface 关键字。对于很多新手来说,C++ 当中接口的概念不容易像 Java 当中那样被理解。

然而接口是面向对象编程当中的重要组成部分,也是新手需要学习的重要思维,虽然 C++ 并不那么面向对象。

首先,要明确接口的概念:

接口的存在意义是为不同的派生类提供统一的标准,继而实现面向对象编程当中的多态 概念。

对象是对客观事物的抽象,类是对对象的抽象。

那么,C++ 当中既然不存在 interface 关键字,那么接口是通过什么方式来实现的呢?

首先要讲两个概念:

一、纯虚函数 (Pure Virtual Function) :

1,纯虚函数只有函数名、参数、返回值类型。

2,纯虚函数的定义是在函数句首使用 virtual 关键字修饰,并且在句末增加 “= 0″。

3,纯虚函数不能包含实现,只有声明,所以纯虚函数不能被调用。

4,定义纯虚函数的目的在于,使每一个派生类都拥有相同的函数规范。

承上启下:包含纯虚函数的类就是抽象类。

二、抽象类 (Abstract Class) :

1,抽象类必须包含一个纯虚函数,存在纯虚函数的类就一定是一个抽象类。

2,抽象类不能被实例化,只能被继承派生,因为纯虚函数没有函数体,不是完整的函数,无法调用,也无法为其分配内存空间。

3,派生出来的子类必须实现所有抽象类当中的纯虚函数。

4,抽象类默认存在隐式的构造函数,但是不能将构造函数定义为纯虚函数。(因为无意义)

5,析构函数可以定义成纯虚函数,相应的派生类也要给出析构函数的实现。

6,如果派生出来的子类没有实现父抽象类当中的所有纯虚函数,那子类仍然是抽象类。

所以,特点就很显而易见了,有这么一个”类”,它不能被实例化,只能被继承,而继承它的派生类必须要重写它声明的所有函数。

这就是接口的概念,为所有派生类提供了一个统一的规范可以实现多态。

====================================

演示讲解部分

这里的 Demo 不像高校老师或培训机构那样随便写几个类来演示了,而是选择一个更贴合实际开发的场景:

定义一个接口(抽象类),两个动态库去继承并分别采用不同实现,最后在 main 函数中执行通过多态获得不同效果。

演示使用 Visual Studio 2022,其中会涉及智能指针、动态库类的导出、动态库链接等额外知识点,自行 MSDN 补充。

Visual Studio 是一个解决方案包含N个项目,这个 Demo 的结构就是接口作为一个项目、两个动态库两个项目、演示执行的EXE一个项目。

新建第二和第三个项目:两个动态库

分别叫 “人力工具箱” 和 “电脑工具箱”

其中两个项目的 dllmain、phc、framework完全一致,并且VS会自动帮你创建。

但是要注意,两个项目新建后,要将接口头文件所在的路径添加到 “附加包含目录”。

补充 DLL 导出相关知识(重要):

dllexport 与 dllimport 属性官方解释:https://docs.microsoft.com/zh-cn/cpp/cpp/dllexport-dllimport?view=msvc-170

注意两个属性必须搭配 _declspec() 关键字使用。

我们的两个动态库是给外部程序调用的,所以应使用 _declspec(dllexport),表明类可以被外部所使用。

注意:[摘自MSDN] 不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。

“人力工具箱”动态库:

HumanToolBox.h

HumanToolBox.cpp

“电脑工具箱”动态库:

ComputerToolBox.h

ComputerToolBox.cpp

可以看到,”人力工具箱” 和 “电脑工具箱” 使用了共同的 BrainToolBoxInterface 接口,但是实现完全不同。

最终运行效果:

Original: https://www.cnblogs.com/airchip/p/15881339.html
Author: 芯片烤电池
Title: 【Example】C++ 接口概念讲解及例子演示

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606306/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • CentOS 7上安装和配置Ghost

    Ghost是一个轻量级的开源博客平台,易于使用。Ghost是完全可定制的,有许多主题可用。 在本教程中,您将在CentOS 7上设置Ghost。您还将配置Nginx以代理对Ghos…

    Linux 2023年6月13日
    063
  • Hadoop Shell命令

    http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html Original: https://www.cnblogs.com/…

    Linux 2023年5月28日
    091
  • 性能测试

    一.性能测试概述 性能测试概念: 性能测试是指通过特定方式,对被测系统按照一定策略施加压力,获取系响应时间、TPS、资源利用率等性能指标,以期保证生产系统的性能能够满足用户需求的过…

    Linux 2023年6月6日
    085
  • Ubuntu20.04桌面版 使用root账号登录

    sodu -i 执行命令,输入当前用户密码,临时切换到root身份 执行passwd命令,修改root登录密码 passwd 修改50-ubuntu.conf文件 执行如下命令: …

    Linux 2023年6月13日
    086
  • 4.3 Linux压缩文件或目录为.zip格式(zip命令)

    我们经常会在 Windows 系统上使用 “.zip”格式压缩文件,其实”.zip”格式文件是 Windows 和 Linux 系统…

    Linux 2023年6月7日
    0101
  • 跳石板—牛客网

    #include #include #include using namespace std; //计算第i个&#x7684…

    Linux 2023年6月13日
    0113
  • java处理http请求之Apache httpClient入门教程

    说明 本文示例代码基于 4.5.13 版本 转载请注明出处:https://www.cnblogs.com/qnlcy/p/15378446.html 一、项目介绍 Apache …

    Linux 2023年6月6日
    078
  • Jmeter 使用Json提取请求数据-2

    在接口测试中有一个这样的场景:业务接口需要用到登录token;下个接口需要用到前个接口返回值作为参数,该怎么实现? 首先先看下登录、业务接口,本文用的jmeter版本为5.4.1 …

    Linux 2023年6月8日
    098
  • Shell 实现多线程(多任务)

    1.命令结尾添加:& 在命令的末尾加 & 符号,则命令将在后台执行,这样后面的命令不需要等待该命令执行完再开始执行。 2.解决主线程提前退出问题,添加 wait 3…

    Linux 2023年5月28日
    087
  • 教你搞懂Jenkins安装部署!

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i Jenkins介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作…

    Linux 2023年6月14日
    0120
  • JPA作持久层操作

    JPA(Hibernate是jpa的实现) jpa是对实体类操作,从而通过封装好的接口直接设置数据库的表结构。虽然jpa可以直接通过编写java代码来操作数据库表结构,避免了sql…

    Linux 2023年6月7日
    0116
  • 搭建ES集群

    添加以下elasticsearch用户: bash;gutter:true; 1 useradd elasticsearch 2 passwd elasticsearch</…

    Linux 2023年6月8日
    078
  • Java常见知识点总结

    1 重载 && 重写 重载: 发生在同一个类中, 方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。 重写: 发生在父…

    Linux 2023年6月7日
    094
  • 【原创】Linux虚拟化KVM-Qemu分析(八)之virtio初探

    背景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. –…

    Linux 2023年6月8日
    095
  • 2020年12月-第02阶段-前端基础-CSS Day05

    CSS Day05 学成在线页面制作 理解 能够说写单页面我们基本的流程能说出常见的css初始化语句能说出我们CSS属性书写顺序 应用 能利用ps切图能引入外部样式表能把psd文件…

    Linux 2023年6月8日
    0111
  • C++的vector的使用方法

    vector c++的vector的使用方法,创建,初始化,插入,删除等。 #include "ex_vector.h" #include #include #…

    Linux 2023年6月14日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球