主页
  • 主页
  • 分类
  • 热文
  • 教程
  • 面试
  • 标签
C++

C++ 基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

C++ 字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

C++ 函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

C++ 面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

C++ 高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

C++ 接口


上一章 下一章

一、接口描述

接口描述了一个 C++ 类的行为或能力,但并不承诺特定的实现。C++ 接口是通过抽象类实现的,这些抽象类不应与将实现细节与相关数据分离的概念——数据抽象混淆。

一个类通过声明至少一个纯虚函数来使其成为抽象类。纯虚函数通过在其声明中放置 "= 0" 来指定,如下所示:

class Box {
   public:
      // 纯虚函数
      virtual double getVolume() = 0;
      
   private:
      double length;      // 长方体的长度
      double breadth;     // 长方体的宽度
      double height;      // 长方体的高度
};

抽象类(通常称为 ABC)的目的是提供一个适当的基类,其他类可以从该基类继承。抽象类不能用于实例化对象,仅作为接口。尝试实例化抽象类的对象会导致编译错误。

因此,如果需要实例化抽象基类(ABC)的子类,则必须实现每个虚函数,这意味着它支持 ABC 声明的接口。如果派生类未覆盖纯虚函数,然后尝试实例化该类的对象,则会导致编译错误。

可以用来实例化对象的类被称为具体类。

二、抽象类示例

考虑下面的例子,其中父类为基类提供了一个接口来实现一个叫做 getArea() 的函数:

#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 << "矩形总面积: " << Rect.getArea() << endl;

   Tri.setWidth(5);
   Tri.setHeight(7);
   
   // 输出对象的面积
   cout << "三角形总面积: " << Tri.getArea() << endl; 

   return 0;
}

当上述代码被编译和执行时,它产生了如下结果:

矩形总面积: 35
三角形总面积: 17

你可以看到抽象类如何定义了 getArea() 接口,而另外两个类实现了同一个函数,但采用了不同的算法来计算特定形状的面积。

三、设计策略

面向对象系统可能使用抽象基类来提供一个适用于所有外部应用程序的通用且标准化的接口。然后,通过从该抽象基类继承形成操作相似的派生类。

外部应用程序提供的功能(即公共函数)作为纯虚函数在抽象基类中提供。这些纯虚函数的具体实现则在对应于应用程序特定类型的派生类中提供。

这种架构还允许在系统定义之后轻松地将新的应用程序添加到系统中。

上一章 下一章
阅读号二维码

关注阅读号

联系二维码

联系我们

© 2024 Yoagoa. All rights reserved.

粤ICP备18007391号

站点地图