【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. 设计策略 】

  • 面向对象的系统可能会使用一个抽象基类为所有的外部应用程序提供一个适当的、通用的、标准化的接口;然后,派生类通过继承抽象基类,就把所有类似的操作都继承下来。
  • 外部应用程序提供的功能(即公有函数)在抽象基类中是以纯虚函数的形式存在的。这些纯虚函数在相应的派生类中被实现。
  • 这个架构也使得新的应用程序可以很容易地被添加到系统中,即使是在系统被定义之后依然可以如此。
相关推荐
CoderYanger1 天前
视频裁剪+缩放+自动添加水印脚本(Python版)
开发语言·后端·python·程序人生·职场和发展·音视频·学习方法
酷酷的身影1 天前
Managers/APConfigManager.cs
开发语言·ui·c#
拳里剑气1 天前
C++算法:优先级队列
开发语言·c++·算法·优先级队列
小七在进步1 天前
数据结构:用队列实现栈
开发语言·数据结构
从零开始的代码生活_1 天前
C++ 模板入门:函数模板、类模板与实例化机制
开发语言·c++·后端
luj_17681 天前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法
不听话坏1 天前
Ignition篇(下 一) 动态执行前的事情
开发语言·前端·javascript
likeyi071 天前
require 和 import的区别
开发语言·前端
远离UE41 天前
UE5 compute shader 原子加
开发语言·c++·ue5
C+-C资深大佬1 天前
C++ 显式类型转换详解:static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++