当前位置: 首页 > news >正文

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

文章目录

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

  • 接口描述了类的行为和功能,而不需要完成类的特定实现。
  • C++ 接口是使用 抽象类(abstract base class,也称为ABC) 来实现的。

【 1. 抽象类 】

1.1 抽象类的定义

  • 如果 类中至少有一个函数被声明为纯虚函数,则这个类就是 抽象类。纯虚函数是通过在声明中使用 “= 0” 来指定的,如下所示:
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(),两个派生类是如何通过不同的计算面积的算法来实现这个相同的函数。
#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. 设计策略 】

  • 面向对象的系统可能会使用一个抽象基类为所有的外部应用程序提供一个适当的、通用的、标准化的接口;然后,派生类通过继承抽象基类,就把所有类似的操作都继承下来。
  • 外部应用程序提供的功能(即公有函数)在抽象基类中是以纯虚函数的形式存在的。这些纯虚函数在相应的派生类中被实现。
  • 这个架构也使得新的应用程序可以很容易地被添加到系统中,即使是在系统被定义之后依然可以如此。

相关文章:

  • C#几种截取字符串的方法
  • cmmlu数据处理
  • 《持续交付:发布可靠软件的系统方法》 - 目录
  • Windows内的Ubuntu虚拟机安装docker
  • Django路由层之有名分组和无名分组、反向解析、路由分发、伪静态的概念、名称空间、虚拟环境、Django1和Django2的区别
  • 国内领先的五大API接口供应商
  • 【golang】探索for-range遍历实现原理(slice、map、channel)
  • python科研绘图:圆环图
  • 程序员的绝望和欢笑:当拼写错误搞乱了我的代码
  • 前端设计模式之【代理模式】
  • 【Java 进阶篇】JQuery 遍历 —— For 循环的奇妙之旅
  • react hook ts 实现 列表的滚动分页加载,多参数混合混合搜索
  • ctf之流量分析学习
  • 沉浸式航天vr科普馆VR太空主题馆展示
  • Beautiful Soup爬取数据html xml
  • [译] 怎样写一个基础的编译器
  • 345-反转字符串中的元音字母
  • angular2 简述
  • Angular数据绑定机制
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript 奇技淫巧
  • JavaScript类型识别
  • js递归,无限分级树形折叠菜单
  • js正则,这点儿就够用了
  • mysql 5.6 原生Online DDL解析
  • PHP CLI应用的调试原理
  • Vue实战(四)登录/注册页的实现
  • vue学习系列(二)vue-cli
  • 电商搜索引擎的架构设计和性能优化
  • 反思总结然后整装待发
  • 少走弯路,给Java 1~5 年程序员的建议
  • 首页查询功能的一次实现过程
  • 找一份好的前端工作,起点很重要
  • 你对linux中grep命令知道多少?
  • Mac 上flink的安装与启动
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 如何用纯 CSS 创作一个货车 loader
  • ​iOS安全加固方法及实现
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ( 10 )MySQL中的外键
  • (27)4.8 习题课
  • (day 12)JavaScript学习笔记(数组3)
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET MVC之AOP
  • .net wcf memory gates checking failed
  • .NET4.0并行计算技术基础(1)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .net对接阿里云CSB服务
  • .net反混淆脱壳工具de4dot的使用