本实例来自《C++ Primer Plus》(第六版) 第十三章

题目要求:

假设你正在开发一个图形程序,该程序会显示圆和椭圆等,需要考虑:
  • 椭圆要包含椭圆中心坐标,半长轴,半短轴以及方向角的数据。圆要实现圆心坐标,半径等数据。
  • 椭圆要包含移动,旋转一定角度,计算面积和缩放等方法,但是圆不需要旋转。

设计思路:

  • 虽然圆也是一种椭圆的特殊形势,但是设计成由圆类继承椭圆类显然是十分笨拙的。比较好的办法是涉及一个基类BaseEllipse,圆和椭圆都继承此基类。这样便可以使用指针数组同时管理Circle对象和Ellipse对象、

知识点:

  1. C++通过纯虚函数提供基类未实现的方法,纯虚函数的声明为在函数声明的结尾处添加“=0”,例如基类中的Area方法:

    1. virtual double Area() const = 0;//a pure virtual function
  2. 当类声明中包含纯虚函数的时候,则不能创建该类的对象,包含纯虚函数的类只能作为基类,设计时更多作为接口来使用。
  3. 派生类必须为基类实现纯虚函数的复写(Override),否则不能通过编译。
  4. 要注意当使用基类的指针数组创建管理派生类对象的时候,指针只能指向基类声明过的权限为public的函数,不能使用派生类中的新的成员函数。
  5. 复习一下类产生对象的两种方法
    1. Circle *c = new Circle(1, 0, 1);
    2. Circle d(1, 1, 0);

总结与疑问:

  • 抽象基类一般被用作接口来使用,抽象基类不能实例化对象,包含至少一个纯虚函数的类叫做抽象基类。
  • 如果使用抽象基类的指针数组来管理派生类,那么该数组中的指针不能使用派生类中的新方法(即没有在基类中被以任何形式声明过的方法),如果派生类的所有方法都在抽象基类中声明,又会有些类不会用到接口的全部方法。带来设计上的冗余。

代码实现:

BaseEllipse.h(由于问题比较简单,所有函数均使用内联函数,只为了说明设计的思路)
  1. #pragma once
  2. //基类指针指向派生类的时候,不能使用派生类新定义的函数的问题。
  3. class BaseEllipse {
  4. private:
  5. double x;
  6. double y;
  7. public:
  8. BaseEllipse(double x0 = 0,double y0 = 0):x(x0),y(y0){}
  9. virtual ~BaseEllipse(){}
  10. void Move(int nx, int ny) { x = nx; y = ny; }
  11. virtual double Area() const = 0;//a pure virtual function
  12. virtual void Scale(double sa, double sb){};
  13. virtual void Scale(double sr){}
  14. virtual void Rotate(double nang){}
  15. };
  16. class Ellipse :public BaseEllipse {
  17. private:
  18. double a;
  19. double b;
  20. double angle;
  21. public:
  22. Ellipse(double x0 = 0, double y0 = 0, double a0 = 0, double b0 = 0, double angle0 = 0) :BaseEllipse(x0, y0) { a = a0; b = b0; angle = angle0; }
  23. virtual double Area() const { return 3.14*a*b; }
  24. virtual void Scale(double sa, double sb) { a *= sa; b *= sb; }
  25. virtual void Rotate(double nang) { angle += nang; }
  26. };
  27. class Circle :public BaseEllipse {
  28. private:
  29. double r;
  30. public:
  31. Circle(double x0=0, double y0=0, double r0=0) :BaseEllipse(x0, y0) { r = r0; }
  32. virtual double Area() const { return 3.14*r*r; }
  33. virtual void Scale(double sr) { r *= sr; }
  34. };
来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/zzandliz/p/5062642.html

C++编程实践: 抽象基类相关推荐

  1. 【JavaSE8 高级编程 IO/NIO】IO入门系列①之抽象基类节点流转换流 2019_8_16

    IO输入输出 IO 实现体系概述 [文档级] ①IO基石 四抽象基类 [IS,OS / R,W]抽象基类简述 子类及其实现接口 字节(FIS,OIS)字符(BR,ISR)读 字节(FOS,OOS,PS ...

  2. C++中为什么要引入抽象基类和纯虚函数?

    为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ⑴抽象类的定义:带有纯虚函数的类为抽象类. ...

  3. C++引入抽象基类和纯虚函数的作用和目的

    为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 原文链接:https://blog.csdn.net/weibo1230123/article/details/82014322 ...

  4. C++之继承探究(十):抽象基类与纯虚函数

    前文:C++之继承探究(九):多态的代价 抽象基类与纯虚函数   ♠\spadesuit♠ 纯虚函数:虚函数只有声明,函数体=0,就是一个纯虚函数,纯虚函数没有函数体,不需要实现.在子类里实现纯虚函数 ...

  5. python虚函数_Python进阶话题杂谈(十三)纯虚函数与抽象基类

    纯虚函数与抽象类都是Python面向对象中重要的编程范式,用于对继承类做强制性接口实现约定. abc模块包含了一系列与抽象基类与纯虚函数相关的方法.Python中通过修改元类进行抽象基类的设定.这里P ...

  6. C++ day24 继承(四)抽象基类,纯虚函数,protected

    文章目录 关键字protected(带来方便同时带来危险,最好不用) 抽象基类和纯虚函数(is-a关系用公有继承实现有时候也不太合适) 用圆和椭圆的笨拙派生为例,挑拨is-a和公有继承的搭档关系 替代 ...

  7. Python高级:了解Python ABC(抽象基类)及 应用场景

    ABC,Abstract Base Class(抽象基类),主要定义了基本类和最基本的抽象方法,可以为子类定义共有的API,不需要具体实现.相当于是Java中的接口或者是抽象类. 抽象基类可以不实现具 ...

  8. Python学习笔记28:从协议到抽象基类

    Python学习笔记28:从协议到抽象基类 今后本系列笔记的示例代码都将存放在Github项目:https://github.com/icexmoon/python-learning-notes 在P ...

  9. python之抽象基类

    抽象基类特点 1.不能够实例化 2.在这个基础的类中设定一些抽象的方法,所有继承这个抽象基类的类必须覆盖这个抽象基类里面的方法 思考 既然python中有鸭子类型,为什么还要使用抽象基类? 一是我们在 ...

  10. 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment

    24 UsageEnvironment使用环境抽象基类--Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类--Live555源码阅读 ...

最新文章

  1. android clean 框架,clean架构
  2. iOS常用第三方开源框架和优秀开发者博客等
  3. Javascript小括号“()”的多义性
  4. 晶振,数字电路的心脏~
  5. Redis在windows下安装过程
  6. 掘金企服:ICP经营许可证和ICP备案的区别
  7. MindFusion教程:如何构建Java Swing中的区域图
  8. 高维数据可视化之t-SNE算法
  9. php将word转化成html,phpword转html
  10. tf1.x版RandLA-Net源码解读(5):测试
  11. python参数估计(一个总体均值)
  12. qchart实现图片缩放 qt_Qt图形图像开发曲线图表模块QChart库缩放/平移详细方法与实例...
  13. 守望先锋的蜂窝盾制作
  14. OPPO A59m刷机包|OPPO A59m官方线刷包救砖
  15. 基于51单片机的数码录音放音系统设计
  16. ccsp2018游记
  17. 计蒜客 - T1029 计算2的幂
  18. Java练习demo 20190402 优惠券扣减
  19. WannaMine挖矿木马手工处理-NetworkDistribution
  20. 暴风魔镜SDK:MojingSDK For Unity V1.3.5112 (R).zip

热门文章

  1. 图论 有向无环图 拓扑排序 是什么
  2. 数据结构和算法——八种常用的排序算法------基数排序的优化(队列实现)
  3. Floyd 多源最短路径
  4. WebService 常用免费调用接口 与 JWS(Java Web Service) 调用第三方 webService 天气服务
  5. HTML DOM Image 对象
  6. Red Hat 4.4.7 安装 Mysql 5.7
  7. python接口在哪里_在Python中实现接口?
  8. Spring Boot_打造企业级微信点餐系统_汇总贴
  9. Python3初级知识整理
  10. linux定时器的实现方法