C++ 抽象基类

抽象基类 抽象基类 如何知道正在使用的对象是否符合一个给定的规范?在Python中回答该问题的常见答案被称作duck typing模式。如果它看起来像一只鸭子并且叫起来像一只鸭子,那么它大概就是一只鸭子。 在处理编程和对象时,问题通常可以转化为一个对象是否实现了给定方法,或包含一个特定的属性。如果一个对象有一个quack方法,你就有恰当的证据证明它是一只鸭子。此外,如果你只需要一个 quack方法,,实际... 阅读详情
AI摘要

本文详细介绍了C++中抽象基类(ABC)的概念,如何通过纯虚函数定义接口,以及在Brass与BrassPlus类中的应用实例。展示了如何利用抽象基类管理不同特性的派生类,并提供了ABC设计理念和编程步骤。

C++ 抽象基类

一、简介

抽象基类: abstract base class,简称ABC,只定义接口,而不涉及实现,主要用于定义派生类的通用接口。抽象基类必须包含至少一个纯虚方法。且包含纯虚函数的抽象基类,不能用来创建对象,只能用作基类。

纯虚方法: 在函数声明的结尾处添加 =0,以表示此函数为纯虚函数。在当前类可不用给出实现。举例声明方式如下:

// 纯虚函数
virtual void functionname() = 0;

二、举例说明

比方说有A、B两个类,最初的设计思想是B类继承A类,但是实际使用过程中发现,A类的许多特性对B类是没有实际意义的,但是A类与B类确实有一定的共同特性。这种情况下我们可以采用抽象基类的方式进行设计。

即从A类与B类抽象出这两个类具有的共同特性,并将这些特性放到一个**ABC(抽象基类)**中,然后再从这个ABC派生出A类与B类。这样就可以使用抽象基类指针同时管理A类与B类对象,可以使用多态方法。

三、实际应用说明

在函数原型中使用=0指出类是一个抽象基类,但在类中可以不定义该函数。但C++可以允许纯虚函数有定义实现。下面以Brass与BrassPlus类使用进行说明,Brass与BrassPlus类是从抽象基类派生出的派生类,向Circle与Ellipse类有时被称具体类,表示可以创建Brass与BrassPlus类对象。

总之,ABC(抽象基类)描述的是至少使用一个纯虚函数的接口,从ABC(抽象基类)派生出的类将根据派生类的具体特征,使用常规虚函数来实现这种接口。

(1)下面示例是ABC(抽象基类)、Brass派生类、BrassPlus派生类具体声明:

// AcctABC抽象基类
class AcctABC
{
private:
    std::string fullname;
    long acctnum;
    double balance;

protected:
    struct Formatting
    {
        std::ios_base::fmtflags flag;
        std::streamsize pr;
    };
    const std::string &FullName() const;
    long AcctNum() const;
    Formatting SetFormat() const;
    void Restore(Formatting &f) const;

public:
    AcctABC(const std::string& s = "Nullbody", long an = -1, double bal = 0.0);
    virtual ~AcctABC();

    void Deposit(double amt);
    double Balance() const ;
    // Withdraw 纯虚函数
    virtual void Withdraw(double amt) = 0;
    // ViewAcct 纯虚函数
    virtual void ViewAcct() const = 0;
};

Brass派生类

抽象基类(ABC) 抽象基类(ABC) 文章目录抽象基类(ABC)前言如何实现ABC为什么需要ABC其他 前言 我对抽象基类(Abstract Base Class,ABC)的理解在两个点上。第一点是抽象,即高度抽象;第二点是基类,对抽象基类来说,它只能作为基类,不可以被实例化。 高度抽象一词听起来本身就很“抽象”,不妨让我用“总结”这个词进行通俗解释。比方这里有两类人,一类只是聋人,另一类只是盲人。现在我们需要对... 阅读详情

相关推荐

C++抽象基类ABC理念(Abstract Base Class)(纯虚函数)

对于继承来说,有时候is-a规则并不是看上去的那么简单,比如正在开发一个图形程序,程序会显示圆和椭圆。椭圆有长轴和短轴两个数据成员,当长轴等于短轴时,就相当于是一个圆了。因此我们可以将椭圆类作为父类,圆类作为特殊的子类,但是这会带来一些问题。实际上圆并不需要两个数据成员来刻画,用一个半径就能够刻画了。 一.抽象基类理念 对于上面这种问题,我们可以从Ellipse(椭圆)和Circle(圆)类中抽象出它们的共性,将这些特性放到一个ABC(抽象基类)中。再从这个ABC类派生出Ci...

YourClerk的博客 2273

C++ 设计抽象基类的策略

(1)分析相关对象的需求,设计出一组实现公共功能的函数。 (2)将这些函数作为基类的虚函数(或纯虚函数),它们定义了一个          统一的公共接口。 (3)由该类基类派生出若干子类,在各子类中实现这些虚函数。 #include using namespace std; class Container //抽象类 { protected: double radius; publi

3020

C++中的抽象基类(Abstract Base Class)

背景: 有时候,我们想调用两个相似类的同名函数,如下图: Circle类: class Circle { public: Circle(double radius) : radius{radius} { } double area() const { return radius * radius * 3.1415927; } private: double radius; }; Rectangle类: class Rectangle { public: Rectangle(d

Jeremiah_218的博客 1464

谭浩强C++课后习题38——抽象基类派生

谭浩强C++课后习题38——抽象基类派生 题目描述:编写一个程序,声明抽象基类Shape,由它派生出3个派生类:Circle(圆形),Rectangle(矩形),Triangle(三角形),用一个函数printArea分别输出以上三者的面积,3个图形的数据在定义对象时给定。 抽象基类:含有纯虚函数的基类,不能直接用于定义对象,可以用来派生新的类,派生出的新类中可以实现纯虚函数,用指向抽象基类的指针...

weixin_45295612的博客 1210

SuperPoint+SuperGlue在HLoc中的实战效果对比:5大公开数据集测试报告

本文在HLoc框架下,对传统SIFT与深度学习组合SuperPoint+SuperGlue在五大公开数据集上的视觉定位效果进行了实战对比测试。报告详细分析了两种方案在Aachen Day-Night、RobotCar Seasons等不同光照、季节及场景下的表现,揭示了SuperPoint+SuperGlue在应对剧烈光照变化和长期外观变化时的显著优势,并提供了基于HLoc模块化设计的选型与配置策略。

weixin_29093169的博客 425

西门子WinCC VBS脚本实战:5分钟搞定变量记录导出到Excel(附完整代码)

本文提供了一套高效的西门子WinCC VBS脚本方案,帮助工程师在5分钟内将变量记录数据导出至Excel。方案详细解析了时区转换、数据库连接、SQL查询优化等核心难点,并附带了完整、可直接使用的VBS代码,解决了工业自动化项目中数据导出的实际痛点。

moss5的博客 609

单片机OTA升级:Bootloader如何多重校验保障APP完整性?

本文详细介绍了单片机OTA升级中Bootloader如何通过CRC校验、数字签名、版本比对和存储位置检查等多重校验机制保障APP完整性。CRC校验作为快速检测数据完整性的核心手段,结合其他安全措施有效防止设备变砖和安全漏洞,确保远程升级的可靠性。

l3m4n的博客 981

企业碳排放计算方法与实践:从年度总量到月度分配的完整流程

本文系统介绍了企业碳排放计算的全流程方法,包括数据预处理、能源活动与产品生产碳排放计算、年度汇总及月度分配优化。通过ARIMA模型预测补充缺失数据,采用二次规划算法实现基于用电量模式的月度碳排放分配,确保计算结果的准确性与合理性。该方法为企业碳排放管理提供了科学工具,有助于精准监控排放、制定减排策略并满足合规要求。实施中需注重数据质量控制和排放因子选择,并根据企业特点调整参数。该流程适用于制造业企业,为实现碳中和目标提供可靠的数据基础和管理支持。

applehunqiu的博客 1572

Python实战:3步搞定DICOM转JPG/PNG(附批量处理脚本)

本文详细介绍了如何使用Python在3步内将DICOM医学影像转换为JPG/PNG格式,并提供了批量处理脚本。通过Pydicom、Pillow和NumPy库的组合,解决了像素值处理、批量转换效率和医学图像特性保留等关键问题,适合医疗AI开发者和放射科医生快速集成到工作流中。

numpy6sculptor的博客 589

Win11 C盘爆满别慌!手把手教你安全迁移AppData和用户文件夹(附一键脚本)

本文针对Win11 C盘空间不足问题,提供了一套安全有效的解决方案。通过深入解析用户目录结构,指导用户利用符号链接和Robocopy工具,将AppData、下载文档等占用大户迁移至其他分区,并附带了自动化脚本,从根本上实现C盘瘦身,同时确保系统稳定和数据安全。

weixin_29231221的博客 2084

基于GA-BP遗传算法优化神经网络的多输入多输出数据预测-Python代码实现

多输入多输出的GA-BP神经网络

2301_80449389的博客 2306

国科大学习资料--机器人智能控制_袁如意老师PPT后习题答案(学长精心整理)

人工神经元激活函数的作用是什么? 答:激活函数是用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型所不能解决的问题。 人工神经网络的学习规则有哪些?各有何特征? 答:大类可以分为无监督学习算法、有监督学习算法和强化学习。其中无监督学习算法指只有输入信息,没有期望的输出信息,如Hebb学习规则,神经元连接强度的变化与两个相互连接的神经元的激活水平成正比。竞争学习法则:网络各输出单元相互竞争,最后达到只有一个最强者激活。有监督学习算法指同时提供输入信息和对应的期望输出信息,如误差学习(Delta学

无名何许人的博客 1486

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: C++静态联编和动态联编
下一篇: C++ 继承与动态内存分配
渐进者
博客等级 码龄12年 6粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值