前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >EasyC++81,抽象基类

EasyC++81,抽象基类

作者头像
TechFlow-承志
发布于 2022-08-26 10:00:53
发布于 2022-08-26 10:00:53
31300
代码可运行
举报
文章被收录于专栏:TechFlowTechFlow
运行总次数:0
代码可运行

作者 | 梁唐

大家好,我是梁唐。

这是EasyC++系列的第81篇,抽象基类。

抽象基类

这一篇文章来聊聊抽象基类(abstract base class简称ABC)。

我们之前说过,在我们实现继承的时候,需要保证派生类和基类之间是一种is-a的关系。在大多数时刻,这样的关系是没有问题的,然而在一些特殊的情况可能会遇到问题。

比如说,假设我们要实现所有的图形。在图形当中,圆是一种特殊的椭圆。但椭圆包含的属性更多,椭圆除了有中心点之外,还有半长轴、半短轴,以及方向角,而圆只需要圆心和半径即可。

也就是说虽然圆是椭圆,但圆包含的属性却更少,而不是更多。这就带来了一个问题,当我们使用继承的时候,圆并不需要半长轴、半短轴以及方向角这些信息。并且一些方法在逻辑上会有一些出入,比如说旋转rotate方法,对于圆来说并不需要旋转,再比如说放大缩小,圆的逻辑也和椭圆不同。

虽然我们有一些办法可以解决,但总体来说,在这种情况下不使用继承反而更加简单。但不使用继承又会导致圆和椭圆两者相同的逻辑需要复制粘贴一份,也不是非常合适。

针对这种情况,C++当中还有一种解法,就是将圆和椭圆类中抽象出共性,将这些共性放在一个ABC中。然而从该ABC派生出CircleEllipse类,这样我们可以使用基类指针数组同时管理CircleEllipse对象,即可以实现多态。

比如圆和椭圆的共同点是都有中心坐标,Move方法也相同,以及都有Area方法。但面积的计算方法圆和椭圆的逻辑是不同的,只是方法名一样。所以我们不能在ABC当中实现Area方法,可以将它设置成一个纯虚函数。

纯虚函数表示没有实现的函数,它的声明为结尾处为=0,如下例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class BaseElllipse {
  private:
     double x;
     double y;
     ...
 public:
     BaseEllipse(double x0=0, double y0=0) : x(x0), y(y0) {}
     virtual ~BaseEllipse() {}
     void Move(double nx, ny) {
            x = nx;
            y = ny;
        }
     virtual double Area() const=0;
     ...
};

当类声明当中包含纯虚函数的时候,我们不能创建该类的对象。即包含纯虚函数的类只能用作基类,要成为ABC,类中至少需要包含一个纯虚函数。

在这个例子当中,我们的Area方法没有定义,但C++是允许纯虚函数有定义的。比如,假设我们希望把Move设置成纯虚函数,我们可以这样声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void Move(double nx, ny) = 0;

一样可以给Move函数创建实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void BaseEllipse::Move(double nx, ny) {
    x = nx;
    y = ny;
}

总之在原型当中将函数赋值为0指出类是一个抽象基类,在类中可以不定义该函数。在使用的时候,需要注意,我们不能创建BaseEllipse对象,只能创建以它为基类的子类对象。

在子类当中,我们需要使用常规的虚函数来实现父类中的纯虚函数。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder梁 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python抽象基类的定义与使用
我们写Python基本不需要自己创建抽象基类,而是通过鸭子类型来解决大部分问题。《流畅的Python》作者使用了15年Python,但只在项目中创建过一个抽象基类。我们更多时候是创建现有抽象基类的子类,或者使用现有的抽象基类注册。本文的意义在于,了解抽象基类的定义与使用,可以帮助我们理解抽象基类是如何实现的,为我们以后学习后端语言(比如Java、Golang)打下基础。毕竟抽象基类是编程语言通用设计。
dongfanger
2021/10/20
2.1K0
C++ 打怪 之 抽象类的使用
抽象类的主要作用是对多个子类相同部分抽象为一个基类,其中相同的方法或数据在基类定义,无需基类实现的方法声明为纯虚函数,子类自行实现纯虚函数。可理解为基类定义了类方法规范,具体功能由子类实现。
开源519
2020/12/14
9870
C++继承与多态练习--计算图形面积
1.目的: /*设计一个计算图形面积的类库。 类库的顶层是一个抽象类,并且提供三个纯虚函数;显示数据成员、返回面积和返回体积。 Class Shape { virtual void showData()=0; virtual double reArea()=0; virtual double reVolume()=0; }; 第二层由Shape类派生TwoDimShape(二维图形)和ThreeShape(三维图形), 它们增加了有关的数据成员,但没有成员函数的实现。 第三层派生具体的图形类。TwoDimS
Enterprise_
2018/05/18
1.3K0
EasyC++85,私有继承(三)
但前文当中我们也曾说过,通过包含对象我们一样可以实现has-a的关系,那么在我们进行编码的时候,究竟应该使用哪一种呢?
TechFlow-承志
2022/08/26
3150
【Python 千题 —— 基础篇】面积计算(多种图形面积计算)
编写一个面向对象的程序,定义一个基类 Shape 和两个派生类 Circle 和 Rectangle,用来计算不同图形的面积。基类 Shape 具有一个抽象方法 area(),子类 Circle 和 Rectangle 实现具体的面积计算方法。请根据以下要求实现这些类,并计算半径为 7 的圆和长度为 10、宽度为 4 的长方形的面积。
繁依Fanyi
2024/09/05
1470
【Python 千题 —— 基础篇】面积计算(多种图形面积计算)
C++虚函数知识点总结
对应虚函数的类,该类的对象所占内存大小为,数据成员的大小+一个指向虚函数表指针 (4字节)。
半生瓜的blog
2023/05/12
2200
C++虚函数知识点总结
c++ 深入理解虚函数
为什么使用虚函数?什么是虚函数?虚函数是为了解决什么问题? 面向对象的三大特征: 封装 多态 继承 普通虚函数 虚析构函数 纯虚函数 抽象类 接口类 隐藏 vs 覆盖 隐藏与覆盖之间的关系 早绑定和晚
拾点阳光
2018/05/10
1.7K0
C++系列笔记(五)
【导读】《21天学通C++》这本书通过大量精小短悍的程序详细而全面的阐述了C++的基本概念和技术,包括管理输入/输出、循环和数组、面向对象编程、模板、使用标准模板库以及创建C++应用程序等。这些内容被组织成结构合理、联系紧密的章节,每章都可在1小时内阅读完毕,都提供了示例程序清单,并辅以示例输出和代码分析,以阐述该章介绍的主题。本文是系列笔记的第五篇,欢迎各位阅读指正!
墨明棋妙27
2022/08/24
6960
C++系列笔记(五)
从混乱到清晰:用NotImplementedError重构你的Python代码,NotImplementedError如何助你打造更健壮的API
Python 的异常是通过一个继承自 BaseException 的类层次结构来组织的。NotImplementedError 是从这个层次结构中的一个类继承而来的,具体来说,它是从 Exception 类继承而来的,表示一个已经发生但尚未被处理的异常情况。
小白的大数据之旅
2024/11/20
1410
Python实现抽象基类的3三种方法
Python的抽象基类类似于Java、C++等面向对象语言中的接口的概念。抽象基类提供了一种要求子类实现指定协议的方式,如果一个抽象基类要求实现指定的方法,而子类没有实现的话,当试图创建子类或者执行子类代码时会抛出异常。这里简单介绍一下Python实现抽象基类的三种方法。
py3study
2020/01/06
8910
栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类
栈内存:在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
zhangjiqun
2024/12/16
600
栈内存 ,堆内存区别  C++ 动态内存  == 与equal区别  复合函数奇偶性  三角函数转换公式:  虚函数和纯虚函数:  C++ 中的运算符重载  数据封装,数据抽象  C++ 接口(抽象类
《C++多态性:开启实际项目高效编程之门》
在 C++的广阔编程世界中,多态性是一个强大而富有魅力的特性。它为程序员提供了极大的灵活性和可扩展性,使得代码能够更加优雅地应对复杂的业务需求。在实际项目中,理解和正确应用 C++的多态性至关重要,它可以显著提高代码的质量、可维护性和可扩展性。那么,C++中的多态性在实际项目中的具体应用和实现方式究竟是什么呢?让我们一同深入探索。
程序员阿伟
2024/12/09
1020
类继承
类继承:它能够从已有的类派⽣出新的类,⽽派⽣类继承了原有类(称为基类)的特征,包括⽅法。
Alan_1
2023/04/30
1.3K0
C++基础(七).多态(2)
代码示例 shape.cpp #include <iostream> //cout,endl 相关函数的声明 #define PI 3.1415926 //定义一个PI宏 using namespace std; //设定名称空间 class Shape //定义一个Shape的抽象基类 { public: virtual float getArea()=0; //声明一个纯虚函数 Shape(float x=0); //声明一个带默认参值的构造函数 protected: float h
franket
2021/09/15
4300
Python之抽象基类建议收藏
  以上为Animal的抽象基类,注意重写了__subclasscheck__(cls, subclass)方法来改变issubclass或者isinstance的行为,__subclasscheck__(cls, subclass)必须为@classmethod
全栈程序员站长
2022/07/14
6680
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
函数声明形式 纯虚函数在声明时有其特定的语法形式,如 virtual 函数类型 函数名(参数列表) = 0;。以之前提到的 Base 类中的 virtual void Func() = 0; 为例,virtual 关键字表明这是一个虚函数,而最后的 = 0 则明确指出它是纯虚函数,意味着该函数在当前类(这里是 Base 类)中不提供具体的函数实现(也就是没有函数体),仅预留函数名和参数列表等信息,等待派生类去完善其具体功能。
Rossy Yan
2024/12/24
820
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
第十三章:C++面向对象编程思想详解
面向对象编程(Object-Oriented Programming,简称OOP)是一种软件开发方法,其核心概念是将现实世界的事物抽象为对象,并通过对象之间的交互来描述和解决问题。本文将详细讲解C++中的面向对象编程思想,并结合代码和实际案例进行演示。
GeekLiHua
2025/01/21
990
C++基础(七).多态(1)
C++语言是C语言的拓展,C语言是面向过程的,C++在C的基础上增加了面向对象的方法
franket
2021/09/15
5030
【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】
三个派生类Dog Frog Bird 分别 public继承 Animal,每个派生类会重新定义自己的move()和shout()
Rossy Yan
2024/12/24
1060
【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】
C++多态与虚函数
SarPro
2024/02/20
1750
推荐阅读
相关推荐
Python抽象基类的定义与使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文