【C++面向对象】13. 接口 / 抽象类*

文章目录

  • [【 1. 抽象类 】](#【 1. 抽象类 】)

    • [1.1 抽象类的定义](#1.1 抽象类的定义)
    • [1.2 抽象类的应用条件](#1.2 抽象类的应用条件)
    • [1.3 实例](#1.3 实例)
  • [【 2. 设计策略 】](#【 2. 设计策略 】)

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

  • C++ 接口是使用 抽象类(abstract base class,也称为ABC) 来实现的。

【 1. 抽象类 】

1.1 抽象类的定义

  • 如果 类中至少有一个函数被声明为纯虚函数,则这个类就是 抽象类。纯虚函数是通过在声明中使用 "= 0" 来指定的,如下所示:
cpp 复制代码
class Box
{
   public:
      // 纯虚函数
      virtual double getVolume() = 0;
   private:
      double length;      // 长度
      double breadth;     // 宽度
      double height;      // 高度
};

1.2 抽象类的应用条件

  • 设计抽象类的目的:是为了给其他类提供一个可以继承的适当的基类。
  • 抽象类不能被用于实例化对象,它只能作为接口使用,如果试图实例化一个抽象类的对象,会导致编译错误。(相对应的,可用于实例化对象的类被称为 具体类)。
  • 如果一个 ABC抽象类 的子类需要被实例化,则必须实现每个纯虚函数,这也意味着 C++ 支持使用 ABC 声明接口。 如果没有在派生类中重写纯虚函数,就尝试实例化该类的对象,会导致编译错误。

1.3 实例

  • 抽象类的实例:基类 Shape 提供了一个接口 getArea(),在两个派生类 Rectangle 和 Triangle 中分别实现了 getArea(),我们可以看到:一个抽象类是如何定义一个接口 getArea(),两个派生类是如何通过不同的计算面积的算法来实现这个相同的函数。
cpp 复制代码
#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;
}

【 2. 设计策略 】

  • 面向对象的系统可能会使用一个抽象基类为所有的外部应用程序提供一个适当的、通用的、标准化的接口;然后,派生类通过继承抽象基类,就把所有类似的操作都继承下来。
  • 外部应用程序提供的功能(即公有函数)在抽象基类中是以纯虚函数的形式存在的。这些纯虚函数在相应的派生类中被实现。
  • 这个架构也使得新的应用程序可以很容易地被添加到系统中,即使是在系统被定义之后依然可以如此。
相关推荐
Bona Sun1 天前
单片机手搓掌上游戏机(二十)—pico运行doom之编译环境
c语言·c++·单片机·游戏机
爱丽_1 天前
深入理解 Java Socket 编程与线程池:从阻塞 I/O 到高并发处理
java·开发语言
Albert Edison1 天前
【项目设计】C++ 高并发内存池
数据结构·c++·单例模式·哈希算法·高并发
我真不会起名字啊1 天前
C、C++中的sprintf和stringstream的使用
java·c语言·c++
猿饵块1 天前
ros2--图像/image
c++
多敲代码防脱发1 天前
为何引入Spring-cloud以及远程调用(RestTemplate)
java·开发语言
plmm烟酒僧1 天前
TensorRT 推理 YOLO Demo 分享 (Python)
开发语言·python·yolo·tensorrt·runtime·推理
sailing-data1 天前
【SE】接口标准化
java·开发语言
无名3871 天前
RTPEngine 官方自带的 perl 测试程序
开发语言·perl·通信
fruge1 天前
接口 Mock 工具对比:Mock.js、Easy Mock、Apifox 的使用场景与配置
开发语言·javascript·ecmascript