iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++抽象基类讲解
  • 269
分享到

C++抽象基类讲解

2024-04-02 19:04:59 269人浏览 薄情痞子
摘要

 公众号:Coder梁(ID:Coder_LT) 这一篇文章来聊聊抽象基类(abstract base class简称ABC)。 我们之前说过,在我们实现继承的时候,需要保

 公众号:Coder梁(ID:Coder_LT)

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

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

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

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

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

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

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

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

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设置成纯虚函数,

我们可以这样声明:

void Move(double nx, ny) = 0;

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

void BaseEllipse::Move(double nx, ny) {
    x = nx;
    y = ny;
}

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

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

到此这篇关于C++抽象基类讲解的文章就介绍到这了,更多相关C++抽象基类内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++抽象基类讲解

本文链接: https://www.lsjlt.com/news/161741.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++抽象基类讲解
     公众号:Coder梁(ID:Coder_LT) 这一篇文章来聊聊抽象基类(abstract base class简称ABC)。 我们之前说过,在我们实现继承的时候,需要保...
    99+
    2022-11-12
  • C++抽象基类如何理解
    本篇文章为大家展示了C++抽象基类如何理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。下面来聊聊抽象基类(abstract base class简称ABC)。我们之前说过,在我们实现继承的时候,需...
    99+
    2023-06-26
  • Java 抽象类详细讲解
    目录 Java抽象类概念 Java抽象类示例 继承Animal类的子类的示例 Java抽象类详细使用方法 1、定义抽象类 2、继承抽象类 3、实现抽象方法 4、完整示例代码 Java抽象类概念 Java中抽象类是指用abstract关键...
    99+
    2023-09-04
    java jvm 开发语言 javase 面向对象
  • Java抽象类(基础详解)
    目录 1.概念 2.抽象类的使用 2.1抽象方法 2.2抽象类 2.3抽象类的使用 2.4注意事项 1.概念 普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法,普通方法,static方法,常量和变量等内容...
    99+
    2023-10-21
    java 开发语言
  • 详细讲解Java抽象类示例
    目录Java抽象类概念Java抽象类示例继承Animal类的子类的示例Java抽象类详细使用方法1、定义抽象类2、继承抽象类3、实现抽象方法4、完整示例代码Java抽象类概念 Jav...
    99+
    2023-05-19
    Java 抽象 抽象类
  • C#抽象类怎么理解
    这篇文章主要介绍“C#抽象类怎么理解”,在日常操作中,相信很多人在C#抽象类怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#抽象类怎么理解”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!C#抽象类...
    99+
    2023-06-17
  • Java类与对象超基础讲解
    目录什么是面向对象面向过程与面向对象类与对象的使用类与对象的使用与说明对象的初始化this的使用构造方法this可以调用本类的构造方法什么是面向对象 Java语言是一个纯面向对象的语...
    99+
    2022-11-13
  • C/C++中抽象类详解及其作用介绍
    目录概述抽象类 vs 具体类案例抽象类的作用总结概述 抽象类 (abstract class), 是一些不用来定义对象, 而只作为基类被继承的类. 由于抽象类常用作基类, 所以通常称...
    99+
    2022-11-12
  • Java抽象类详解
    抽象类 抽象类的概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。比如: 说明 1.矩形,三角形,圆形都...
    99+
    2023-09-23
    java 开发语言
  • C#枚举类型的基础讲解
    本篇内容主要讲解“C#枚举类型的基础讲解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#枚举类型的基础讲解”吧!对于C#枚举类型不仅可以提高程序的可读性,而且可以减少因底层值发生改变而导致的程...
    99+
    2023-06-18
  • Java超详细讲解抽象类与接口的使用
    目录一、抽象类1、抽象类的语法2、抽象类的特性3、抽象类的作用二、接口1、接口的概念2、接口使用3、接口特性4、实现多个接口5、接口间的继承6、常用的接口(1)Comparable接...
    99+
    2022-11-13
  • Java超详细讲解抽象类的原理与用法
    目录1. 抽象类是什么2 抽象类的语法3 抽象类都有什么特性4 抽象类是干什么的1. 抽象类是什么 ️给大家上一篇小作文,看完这个,你就理解了什么叫做抽象类 在面向对象的概念中,所有...
    99+
    2022-11-13
  • C#抽象类的用法介绍
    假设有2个类,一个类是主力球员,一个类是替补球员。 public class NormalPlayer { public int ID { get; ...
    99+
    2022-11-13
  • C#中怎么创建抽象类
    这篇文章主要介绍“C#中怎么创建抽象类”,在日常操作中,相信很多人在C#中怎么创建抽象类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中怎么创建抽象类”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!动态...
    99+
    2023-06-17
  • C++抽象数据类型介绍
    公众号:Coder梁(ID:Coder_LT) 我们在学数据结构的时候,经常遇到的一个概念就是抽象数据类型(Abstract Data Type),简称ADT。 维基百科中的定义是:...
    99+
    2022-11-12
  • Java基础巩固抽象类与接口详解
    目录1、抽象类1.1、什么是抽象类1.2、抽象类的用法1.3、抽象类特点(限制条件)2、接口2.1、什么是接口2.2、接口的用法2.3、如何使用接口2.4、接口的特点(限制条件)2....
    99+
    2022-11-13
  • C++OOP对象和类的详细讲解
    目录C++OOP对象和类1.预备知识2.抽象和类2.1 数据抽象2.2 类2.3 接口3.C++中的类和对象3.1 C++类的定义3.2 C++对象的定义3.3 C++访问数据成员3...
    99+
    2022-11-12
  • C++类和对象基础详解
    目录一、类和对象的基本概念结构化程序设计面向对象的程序设计使用类的成员变量和成员函数二、类和对象基础 类成员的可访问范围构造函数(constructor)基本概念拷贝(复制)构造函数...
    99+
    2022-11-12
  • 一文详解Java抽象类到底有多抽象
    目录抽象类1.引出抽象类2.认识抽象类接口1.抽象类和接口的区别2.认识接口3.具体实现USB接口接口表示能力抽象类 1.引出抽象类 向上转型带来的最大的好处就是参数统一化,使用共同...
    99+
    2022-11-13
  • C#抽象类和接口的区别
    这篇文章主要介绍“C#抽象类和接口的区别”,在日常操作中,相信很多人在C#抽象类和接口的区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#抽象类和接口的区别”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作