C++ 接口(抽象类)

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

C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。

如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 "= 0" 来指定的,如下所示:

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

设计抽象类(通常称为 ABC)的目的,是为了给其他类提供一个可以继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用。如果试图实例化一个抽象类的对象,会导致编译错误。

因此,如果一个 ABC 的子类需要被实例化,则必须实现每个虚函数,这也意味着 C++ 支持使用 ABC 声明接口。如果没有在派生类中重载纯虚函数,就尝试实例化该类的对象,会导致编译错误。

可用于实例化对象的类被称为具体类

抽象类的实例

请看下面的实例,基类 Shape 提供了一个接口 getArea(),在两个派生类 Rectangle 和 Triangle 中分别实现了 getArea()

#include 

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;}

当上面的代码被编译和执行时,它会产生下列结果:

Total Rectangle area: 35Total Triangle area: 17

从上面的实例中,我们可以看到一个抽象类是如何定义一个接口 getArea(),两个派生类是如何通过不同的计算面积的算法来实现这个相同的函数。

设计策略

面向对象的系统可能会使用一个抽象基类为所有的外部应用程序提供一个适当的、通用的、标准化的接口。然后,派生类通过继承抽象基类,就把所有类似的操作都继承下来。

外部应用程序提供的功能(即公有函数)在抽象基类中是以纯虚函数的形式存在的。这些纯虚函数在相应的派生类中被实现。

这个架构也使得新的应用程序可以很容易地被添加到系统中,即使是在系统被定义之后依然可以如此。

设计一个扩展自抽象类geometricobject的新的triangle类_C++ 接口(抽象类)相关推荐

  1. 设计一个扩展自抽象类geometricobject的新的triangle类_面向对象设计原则之开放封闭原则(开闭原则OCP)...

    (1) 定义 一个软件实体(类.模块.函数等),对于扩展是开放的,对于更改是封闭的. 对于扩展是开放的:这意味着模块的行为是可以扩展的.当应用的需求发生改变时,我们可以对模块进行扩展,比如增加新的类或 ...

  2. 设计一个扩展自抽象类geometricobject的新的triangle类_如何进行代码抽象设计?

    如何写好一段代码?直接CRUD.if-else.for.一个大方法等实现,从完成任务的角度来说没任何问题,但是会遇到一些问题,例如:后续写个新逻辑又得重新开发,而且代码相似度很高:想添加一个额外的功能 ...

  3. 设计一个扩展自抽象类geometricobject_设计模式4之模板方法模式

    背景 在开发中,你肯定有遇到过这样一种场景:你知道某个方法的关键步骤以及执行顺序,但是里面有的具体步骤并清楚.你会怎么做? 比如你早上起床到公司,我们分解步骤: "起床洗漱吃早餐乘坐交通工具 ...

  4. java参数传入的是一个类名_Java编程细节——泛型的定义(类、接口、对象)、使用、继承...

    1. 设计泛型的初衷: 1) 主要是为了解决Java容器无法记忆元素类型的问题: i. 由于Java设计之初并不知道会往容器中存放什么类型的元素,因此元素类型都设定为Object,这样就什么东西都能放 ...

  5. java教学楼的属性_java设计一个父类建筑物building,由它派生出教学楼类classroom,然后采用一些数据进行测试....

    public class Building { public String bname;//建筑物名称 public int floors;//代表总层数 public double area;//代 ...

  6. java 设计一个geometricobject类,geometricobject类

    (2) Circle 类和 Rectangle 类是 GeometricObject 类的子类,其中应实现 父类的抽象方法. (3) 程序主方法中创建两个几何对象,一个圆和一个矩形,并用 ...... ...

  7. 设计一个回合制战斗系统Combat(C++)

    C++设计一个回合制战斗系统Combat 目录 C++设计一个回合制战斗系统Combat 题目 重要提醒 Soldier类 Wizard类 Master类 Warsystem类 题目 设计和实现回合制 ...

  8. abstract类_012 JAVA 抽象类、接口、String类的基础了解

    1.抽象方法和抽象类 抽象方法:使用abstract修饰的方法,没有方法体,只有声明.抽象方法可以当做是一种规范,让子类必须实现. 注意: 1.抽象方法没有方法体,只能以分号结尾 2.抽象方法只能声明 ...

  9. “抽象类”的定义及其与“普通类”的区别

    我们都知道在多态中子类要重写父类的方法,执行时也执行子类中的方法,这就显得父类中的方法体有点子虚乌有了, 也就是说可以直接省略方法体,而只定义一个方法就可以了.因此,我们称一个没有方法体的方法为抽象方 ...

最新文章

  1. 我的业务要不要用人工智能?引入AI前你需要评估的(一)
  2. 【 FPGA 】抢占式优先级译码器电路
  3. mysql配置文件检查方法
  4. Oracle 序列和触发器
  5. 点击链接微信html代码怎么写,html5微信分享代码怎么写呢?
  6. NYOJ 44 字串和
  7. Struts2中的OGNL详解
  8. 使用halcon将一个圆上的点拟合成圆形并且求出圆心
  9. linux管理外部工具,linux – 除了iptables之外的数据包管理工具?
  10. (36)FPGA打N拍设计(第8天)
  11. python之爬虫学习记录与心得
  12. 美国西北大学 计算机工程专业排名,权威首发!2018年USNews美国大学研究生计算机工程专业排名榜单...
  13. Good, then we can start
  14. 巧用G6FTPServer账号***台湾某图书服务器
  15. 在线textarea工具
  16. ThinkPHP3.2.3--Linux服务器首页文件index.php路径配置问题
  17. 世界各国国家代码简称 - 备用
  18. 基于stc15f2k60s2芯片单片机编程(呼吸灯)
  19. 使用Sencha cmd安装extjs6
  20. linux/android中aplay/arecord用法以及命令

热门文章

  1. LeetCode简单题之两个数组的交集 II
  2. LeetCode简单题之图片平滑器
  3. RGB Color Codes Chart
  4. 深度学习常见问题解析
  5. Fragment之间传递数据的方式
  6. 客快物流大数据项目(五十四):初始化Spark流式计算程序
  7. [C] [最短路] 只有5行的算法:Floyd-Warshall
  8. php dedecms 记录访问者ip,dedecms实现显示访问者ip地址的方法
  9. 绘制多边形_XDGE_RayMarchine 1- 利用Frag Shader绘制图形
  10. Android Studio 工具栏消失了 设置回来