C++编程实践: 抽象基类
题目要求:
- 椭圆要包含椭圆中心坐标,半长轴,半短轴以及方向角的数据。圆要实现圆心坐标,半径等数据。
- 椭圆要包含移动,旋转一定角度,计算面积和缩放等方法,但是圆不需要旋转。
设计思路:
- 虽然圆也是一种椭圆的特殊形势,但是设计成由圆类继承椭圆类显然是十分笨拙的。比较好的办法是涉及一个基类BaseEllipse,圆和椭圆都继承此基类。这样便可以使用指针数组同时管理Circle对象和Ellipse对象、
知识点:
- C++通过纯虚函数提供基类未实现的方法,纯虚函数的声明为在函数声明的结尾处添加“=0”,例如基类中的Area方法:
virtual double Area() const = 0;//a pure virtual function
- 当类声明中包含纯虚函数的时候,则不能创建该类的对象,包含纯虚函数的类只能作为基类,设计时更多作为接口来使用。
- 派生类必须为基类实现纯虚函数的复写(Override),否则不能通过编译。
- 要注意当使用基类的指针数组创建管理派生类对象的时候,指针只能指向基类声明过的权限为public的函数,不能使用派生类中的新的成员函数。
- 复习一下类产生对象的两种方法
Circle *c = new Circle(1, 0, 1);
Circle d(1, 1, 0);
总结与疑问:
- 抽象基类一般被用作接口来使用,抽象基类不能实例化对象,包含至少一个纯虚函数的类叫做抽象基类。
- 如果使用抽象基类的指针数组来管理派生类,那么该数组中的指针不能使用派生类中的新方法(即没有在基类中被以任何形式声明过的方法),如果派生类的所有方法都在抽象基类中声明,又会有些类不会用到接口的全部方法。带来设计上的冗余。
代码实现:
#pragma once
//基类指针指向派生类的时候,不能使用派生类新定义的函数的问题。
class BaseEllipse {
private:
double x;
double y;
public:
BaseEllipse(double x0 = 0,double y0 = 0):x(x0),y(y0){}
virtual ~BaseEllipse(){}
void Move(int nx, int ny) { x = nx; y = ny; }
virtual double Area() const = 0;//a pure virtual function
virtual void Scale(double sa, double sb){};
virtual void Scale(double sr){}
virtual void Rotate(double nang){}
};
class Ellipse :public BaseEllipse {
private:
double a;
double b;
double angle;
public:
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; }
virtual double Area() const { return 3.14*a*b; }
virtual void Scale(double sa, double sb) { a *= sa; b *= sb; }
virtual void Rotate(double nang) { angle += nang; }
};
class Circle :public BaseEllipse {
private:
double r;
public:
Circle(double x0=0, double y0=0, double r0=0) :BaseEllipse(x0, y0) { r = r0; }
virtual double Area() const { return 3.14*r*r; }
virtual void Scale(double sr) { r *= sr; }
};
转载于:https://www.cnblogs.com/zzandliz/p/5062642.html
C++编程实践: 抽象基类相关推荐
- 【JavaSE8 高级编程 IO/NIO】IO入门系列①之抽象基类节点流转换流 2019_8_16
IO输入输出 IO 实现体系概述 [文档级] ①IO基石 四抽象基类 [IS,OS / R,W]抽象基类简述 子类及其实现接口 字节(FIS,OIS)字符(BR,ISR)读 字节(FOS,OOS,PS ...
- C++中为什么要引入抽象基类和纯虚函数?
为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ⑴抽象类的定义:带有纯虚函数的类为抽象类. ...
- C++引入抽象基类和纯虚函数的作用和目的
为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 原文链接:https://blog.csdn.net/weibo1230123/article/details/82014322 ...
- C++之继承探究(十):抽象基类与纯虚函数
前文:C++之继承探究(九):多态的代价 抽象基类与纯虚函数 ♠\spadesuit♠ 纯虚函数:虚函数只有声明,函数体=0,就是一个纯虚函数,纯虚函数没有函数体,不需要实现.在子类里实现纯虚函数 ...
- python虚函数_Python进阶话题杂谈(十三)纯虚函数与抽象基类
纯虚函数与抽象类都是Python面向对象中重要的编程范式,用于对继承类做强制性接口实现约定. abc模块包含了一系列与抽象基类与纯虚函数相关的方法.Python中通过修改元类进行抽象基类的设定.这里P ...
- C++ day24 继承(四)抽象基类,纯虚函数,protected
文章目录 关键字protected(带来方便同时带来危险,最好不用) 抽象基类和纯虚函数(is-a关系用公有继承实现有时候也不太合适) 用圆和椭圆的笨拙派生为例,挑拨is-a和公有继承的搭档关系 替代 ...
- Python高级:了解Python ABC(抽象基类)及 应用场景
ABC,Abstract Base Class(抽象基类),主要定义了基本类和最基本的抽象方法,可以为子类定义共有的API,不需要具体实现.相当于是Java中的接口或者是抽象类. 抽象基类可以不实现具 ...
- Python学习笔记28:从协议到抽象基类
Python学习笔记28:从协议到抽象基类 今后本系列笔记的示例代码都将存放在Github项目:https://github.com/icexmoon/python-learning-notes 在P ...
- python之抽象基类
抽象基类特点 1.不能够实例化 2.在这个基础的类中设定一些抽象的方法,所有继承这个抽象基类的类必须覆盖这个抽象基类里面的方法 思考 既然python中有鸭子类型,为什么还要使用抽象基类? 一是我们在 ...
- 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment
24 UsageEnvironment使用环境抽象基类--Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类--Live555源码阅读 ...
最新文章
- android clean 框架,clean架构
- iOS常用第三方开源框架和优秀开发者博客等
- Javascript小括号“()”的多义性
- 晶振,数字电路的心脏~
- Redis在windows下安装过程
- 掘金企服:ICP经营许可证和ICP备案的区别
- MindFusion教程:如何构建Java Swing中的区域图
- 高维数据可视化之t-SNE算法
- php将word转化成html,phpword转html
- tf1.x版RandLA-Net源码解读(5):测试
- python参数估计(一个总体均值)
- qchart实现图片缩放 qt_Qt图形图像开发曲线图表模块QChart库缩放/平移详细方法与实例...
- 守望先锋的蜂窝盾制作
- OPPO A59m刷机包|OPPO A59m官方线刷包救砖
- 基于51单片机的数码录音放音系统设计
- ccsp2018游记
- 计蒜客 - T1029 计算2的幂
- Java练习demo 20190402 优惠券扣减
- WannaMine挖矿木马手工处理-NetworkDistribution
- 暴风魔镜SDK:MojingSDK For Unity V1.3.5112 (R).zip
热门文章
- 图论 有向无环图 拓扑排序 是什么
- 数据结构和算法——八种常用的排序算法------基数排序的优化(队列实现)
- Floyd 多源最短路径
- WebService 常用免费调用接口 与 JWS(Java Web Service) 调用第三方 webService 天气服务
- HTML DOM Image 对象
- Red Hat 4.4.7 安装 Mysql 5.7
- python接口在哪里_在Python中实现接口?
- Spring Boot_打造企业级微信点餐系统_汇总贴
- Python3初级知识整理
- linux定时器的实现方法