【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)

大家都在看

  • Linux 配置Java环境变量

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i 注:目前,您需要在官网下载时登录。在此共享帐户以方便下载。 [En] Note: at present, you …

    Linux 2023年5月27日
    0104
  • bash怎么调用sql并保存结果

    mysql -uroot -pP@ssw0rd123.abc -h127.0.0.1 -P3306 -e \‘select c.TABLE_SCHEMA ,c.TABL…

    Linux 2023年6月7日
    0180
  • Python环境安装

    一、下载地址: Python:Download Python | Python.org PyCharm:Download PyCharm: Python IDE for Profe…

    Linux 2023年6月13日
    0119
  • Linux安装mysql8.0

    MySQL 配置MySQL8安装源 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3….

    Linux 2023年6月6日
    0105
  • linux自动备份mysql数据库

    备份脚本记录一下–(单个数据库) 2021-11-15 1.新建shell脚本:vim **.sh #!/bin/bashCKUP=/data/backup/db #获…

    Linux 2023年5月27日
    0130
  • Mysql登录错误:ERROR 1045 (28000): Plugin caching_sha2_password could not be loaded

    错误信息: ERROR 1045 (28000): Plugin caching_sha2_password could not be loaded: /usr/lib/x86_6…

    Linux 2023年6月13日
    080
  • Mysql实战技能全解

    一、数据库原理 1 数据的分类 结构化的数据:即有固定格式和有限长度的数据。例如填的表格就是结构化的数据,国籍:中华人民共和国,民族:汉,性别:男,这都叫结构化数据 非结构化的数据…

    Linux 2023年6月7日
    0148
  • Oracle中row_number()、rank()、dense_rank() 的区别

    row_number的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行…

    Linux 2023年6月14日
    0101
  • 一篇文章扒掉“桥梁Handler”的底裤

    Android跨进程要掌握的是Binder, 而同一进程中最重要的应该就是Handler 消息通信机制了。我这么说,大家不知道是否认同,如果认同,还希望能给一个关注哈。 什么是Ha…

    Linux 2023年6月13日
    0102
  • 【设计模式】Java设计模式-建造者模式

    【设计模式】Java设计模式 – 建造者模式 😄 不断学习才是王道🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 @一个有梦有戏的人 @怒放吧德德…

    Linux 2023年6月6日
    0133
  • Kubernetes服务发现之Service详解

    一、引子 Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然后一旦被销毁生命就永远结束。通过 ReplicationController 能够动态地创建…

    Linux 2023年6月14日
    0100
  • VMware ESXi 7.0 U3 SLIC 2.6 & Unlocker

    提供标准版和 Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科) 定制版镜像 请访问原文链接:VMware ESXi 7.0…

    Linux 2023年5月27日
    089
  • wait() 进程控制函数实现伪代码

    wait()的实现 父进程调用 wait() wait() { 进入系统调用 sys_wait() sys_wait () { for { x = true for (循环所有就绪…

    Linux 2023年6月7日
    0117
  • Celery异步任务

    情景: 用户发起request,并等待response返回。在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件、手机验证码等…

    Linux 2023年6月8日
    092
  • cv2简单使用(opencv-python)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月14日
    082
  • Java面向对象之各种变量详解

    在Java中一定有很多变量让大家头疼,成员变量、类变量、局部变量等等,今天就来分别认识认识他们吧! Java面向对象之各种变量详解 前言 在 Java语言中, 根据定义变量位置的不…

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