C++基础——抽象基类(ABC)

C++ 抽象基类 C++ 抽象基类 一、简介 抽象基类: abstract base class,简称ABC,只定义接口,而不涉及实现,主要用于定义派生类的通用接口。抽象基类必 须包含至少一个纯虚方法。且包含纯虚函数的抽象基类,不能用来创建对象,只能用作基类。 纯虚方法: 在函数声明的结尾处添加 =0,以表示此函数为纯虚函数。在当前类可不用给出实现。举例声明方式如下: // 纯虚函数 virtual void functionname() = 0; 二、举例说明 比方说有A、B两个类,最初的设计思想是B类继承A类,但是实际 阅读详情
抽象基类(ABC)即Abstract Base Class

利用了基类指针指向派生类对象从而调用派生类方法的思想实现C++的隐藏

具体实现则主要用到的是纯虚函数

#pragma once
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using std::cout;
using std::endl;
class AbstractClass//抽象基类
//只声明不定义,把具体的细节留给基类去完成
{
public:
	virtual bool SetTime(const int& hour,const int& minute,const int& second)=0;//纯虚函数
	virtual bool GetTime(int& hour,int& minute,int& second)const=0;//获取当前时间到三个参数中
	virtual void ShowTime()const=0;//显示当前时间
	virtual long GetTotalSecond()const=0;//把时间化成秒
};
/////////////////////////////////////////////////////////////////////////////////////////////
class MyTime:public AbstractClass
{
public:
	MyTime(int hour,int minute,int second);
	MyTime();
	//MyTime(const MyTime& t);
	virtual ~MyTime();
	bool SetTime(const int& hour,const int& minute,const int& second);
	bool GetTime(int& hour,int& minute,int& second)const;
	void ShowTime()const;
	long GetTotalSecond()const;
	MyTime SetTimeBySecond(const long& second);////把秒时间化为正常时间
	bool operator>(const MyTime& t);
	bool operator<(const MyTime& t);
	bool operator==(const MyTime& t);
	MyTime operator+(const MyTime& t);
	MyTime operator-(const MyTime& t);
protected:
	void Simplify();//化简
private:
	int m_nHour;
	int m_nMinute;
	int m_nSecond;

};

实现文件:

#include "stdafx.h"
#include "ABC.h"
MyTime::MyTime(int hour,int minute,int second)
:m_nHour(hour),m_nMinute(minute),m_nSecond(second)
{
	if(hour<0||minute<0||minute<0)
		cout<<"输入的参数有误,时间已经归零(0:00:00)"<<endl;
	else
		Simplify();


}
MyTime::MyTime()
{
	SYSTEMTIME sm;
	::GetLocalTime(&sm);//获取系统时间
	m_nHour=sm.wHour;
	m_nMinute=sm.wMinute;
	m_nSecond=sm.wSecond;
}
MyTime::~MyTime()
{
}
bool MyTime::GetTime(int &hour,int &minute,int &second)const
{
	hour=m_nHour;
	minute=m_nMinute;
	second=m_nSecond;
	return true;
}
bool MyTime::SetTime(const int &hour, const int &minute, const int &second)
{
	if(hour<0||minute<0||second<0)
	{
		cout<<"输入参数有误,修改时间失败!"<<endl;
		return false;
	}
	Simplify();
	return true;
}
void MyTime::ShowTime() const
{
	cout<<"当前时间是:"<<m_nHour<<"点"<<m_nMinute<<"分"<<m_nSecond<<"秒"<<endl;
}
MyTime MyTime::operator +(const MyTime &t)
{
	MyTime temp;
	temp.m_nHour=m_nHour+t.m_nHour;
	temp.m_nMinute=m_nMinute+t.m_nMinute;
	temp.m_nSecond=m_nSecond+t.m_nSecond;
	temp.Simplify();
	return temp;

}
void MyTime::Simplify()
{
	m_nHour+=m_nMinute/60;
	m_nHour%=24;
	m_nMinute+=m_nSecond/60;
	m_nMinute%=60;
	m_nSecond%=60;
}
long MyTime::GetTotalSecond()const
{
	return (m_nHour*3600+m_nMinute*60+m_nSecond);
}
bool MyTime::operator >(const MyTime &t)
{
	if(GetTotalSecond()>t.GetTotalSecond())
		return true;
	return false;
}
bool MyTime::operator <(const MyTime &t)
{
	if(GetTotalSecond()<t.GetTotalSecond())
		return true;
	return false;
}
bool MyTime::operator ==(const MyTime &t)
{
	if((m_nHour==t.m_nHour)&&(m_nMinute==t.m_nMinute)
		&&(m_nSecond==t.m_nSecond))
		return true;
	return false;
}
MyTime MyTime::SetTimeBySecond(const long& second)
{
	MyTime temp;
	temp.m_nHour=second/3600;
	temp.m_nMinute=(second-m_nHour*3600)/60;
	temp.m_nSecond=second-m_nHour*3600-m_nMinute*60;
	return temp;
}

MyTime MyTime::operator -(const MyTime &t)
{
	MyTime temp;
	long s;
	if(*this>t)
		s=GetTotalSecond()-t.GetTotalSecond();
	else if(*this==t)
		s=0;
	else
		s=24*3600-(t.GetTotalSecond()-GetTotalSecond());
	temp=SetTimeBySecond(s);
	return temp;
}

控制台测试:

// 抽象基类.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "ABC.h"
/*ABC即Abstract Base Class抽象基类*/
int _tmain(int argc, _TCHAR* argv[])
{
	AbstractClass* p=(AbstractClass*)new MyTime();//基类指针指向派生类对象,调用派生类的方法
	p->ShowTime();
	int h,m,s;
	p->GetTime(h,m,s);
	cout<<h<<":"<<m<<":"<<s<<endl;
	h=25;
	p->SetTime(h,m,s);
	p->ShowTime();
	MyTime t1(1,30,43),t2(22,43,43);
	t1=t1+t2;
	t1.ShowTime();
	return 0;
}





 

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

相关推荐

抽象基类(ABC)

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

有关心情 2283

c++之——抽象基类

在一个虚函数的声明语句的分号前加上 =0;就可以将一个虚函数变成纯虚函数,其中,=0只能出现在类内部的虚函数声明语句处。纯虚函数只用声明,而不用定义,其存在就是为了提供接口,含有纯虚函数的类是抽象基类。我们不能直接创建一个抽象基类的对象,但可以创建其指针或者引用。值得注意的是,你也可以为纯虚函数提供定义,不过函数体必须定义在类的外部。但此时哪怕在外部定义了,也是纯虚函数,不能构建对象。 派生类构造...

weixin_34034670的博客 257

P29-c++类继承-06抽象基类详细介绍

文章目录1. 抽象基类2.应用ABC概念3. ABC理念 1. 抽象基类 至此,介绍了简单继承和较复杂的多态继承。接下来更为复杂的是抽象基类( abstract base class,ABC)。 我们来看一些可使用ABC的编程情况。 有时候,使用is-a规则并不是看上去的那样简单。例如,假设您正在开发一个图形程序,该程序会显示圆和椭圆等。 圆是椭圆的一个特殊情况一一长轴和短轴等长的椭圆。因此,所有的圆都是椭圆,可以从 Ellipse类派生出 Circle类。但涉及到细节时,将发现很多问题。 首先考虑 Ell

梦悦foundation 426

C++的抽象基类

抽象基类的定义: 当我们把类看作一种数据类型时,通常会认为该类肯定是要被实例为一个或多个对象的。但在很多情况下,定义那些不能实例化出对象的类是很有用的,例如一个抽象基类Shape的纯虚函数Draw()它并不知道自己要画一个什么形状,具体画什么圆啊,矩形啊等等都由派生类决定。因此依据这个可以将类分为抽象类(不能实例对象)和具体类OR实现类(可以实例对象)。抽象类的唯一目的就是让其派生类继承并实现它的接口方法(例如上面谈到的Draw()),因此也通常被称为抽象基类。 抽象基类的创建 如果将基类的虚函数声明为纯虚

天才小熊猫 1940

simulink求解器选择的小tip

给出了simulink选择求解器的一种tip,与积分初值有关。

高能阿博特的博客 2053

MinIO vs 华为云OBS:成本、性能与兼容性深度对比(含实测数据)

本文深度对比了开源对象存储MinIO与华为云OBS在成本、性能、兼容性及运维方面的核心差异。通过实测数据与全生命周期成本分析,为技术决策者提供选型依据。文章指出,MinIO在长期成本控制、性能深度优化及S3 API兼容性方面优势显著,而华为云OBS则提供开箱即用的便利性。

kmeans3miner的博客 593

C++的抽象基类ABC

C++的抽象基类ABC

little_startoo的博客 333

华为OD机考双机位C卷 - 斗地主之顺子 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 斗地主之顺子(OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 9692

C++ 抽象基类(ABC)

至少包含一个纯虚函数叫做ABC。

mantouyouyou的博客 209

2023年电工杯 | 2023年电工杯数学建模竞赛思路(A题、B题)

2023年电工杯 | 2023年电工杯数学建模竞赛思路(A题、B题)

前程算法屋的博客 5593

Android12 适配 usb 触屏

在 Android 系统中,输入设备 IDC(Input Device Configuration)设备描述文件(.idc)是用于配置和定义输入设备行为和属性的文本文件。 该文件通常在`/system/usr/idc/` 或 `/vendor/usr/idc/`,具体位置因芯片厂商SDK而异。一般情况此类文件是预置到系统,开发者 root 权限才能修改这些文件。输入设备 IDC 设备描述文件在 Android 系统中起到了识别、配置、映射和定制输入设备的作用,使得系统能够准确解析和处理各种输入设备的事件,提

weixin_35723192的博客 1229

python 、java、c++ 抽象基类ABC的区别及代码案例

本文对比了Python、Java和C++中抽象基类的核心特性和实现方式。Python通过ABC模块和@abstractmethod实现运行时检查,支持多继承;Java采用abstract关键字和接口,编译时检查且不支持类多继承;C++通过纯虚函数(=0)在编译时强制实现。三者差异主要体现在错误检测时机(运行时/编译时)、多态机制、设计哲学和内存管理等方面。代码案例展示了各语言实现抽象基类及继承的具体语法,特别解析了C++虚函数与纯虚函数的关键特性。不同语言的抽象机制反映了其各自的类型系统和设计理念。

452

Cadence 开发合集【总目录】

专栏主要介绍Cadence原理图和PCB信号完整性电源完整性仿真相关的内容,更加注重实操,以帮助大家轻松上手并不断提高;在开始专栏的更新前,博主先列出专栏的大纲,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。 ............

fydar的博客 1万+

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

在 C++ 中,抽象基类(Abstract Base Class,ABC)是一种特殊的类,它主要用于作为其他类的基类,提供一个公共的接口。抽象基类不能被实例化,也就是不能创建抽象基类的对象,它的主要作用是为派生类定义一个统一的接口规范,派生类需要实现这些接口。

luotuo28的博客 857

即插即用系列(代码实践) | CVPR 2025 FDConv:频域动态卷积,打破密集预测任务的参数效率瓶颈

本文提取自 CVPR 2025 的最新底层算子革新论文《Frequency Dynamic Convolution for Dense Image Prediction》。近年来,动态卷积(Dynamic Convolution)通过融合多个并行卷积核极大地提升了模型性能,但研究表明:这些并行卷积核在频域上的响应高度相似,导致了极其严重的参数浪费,且缺乏对不同频率特征的自适应能力。本文复现了该网络的核心架构——FDConv(频率动态卷积)。该方案创造性地在傅里叶域(Fourier Domain)中学习固定参

分享顶会顶刊论文即插即用模块 108

光伏微电网蓄电池储能控制系统设计及动态性能分析

本文构建了光伏微电网蓄电池储能控制系统的完整理论体系。在系统架构方面,提出了基于直流母线电压平衡的多时间尺度能量管理理论,建立了光伏发电单元的二阶物理模型和MPPT动态跟踪算法。针对蓄电池系统,设计了融合二阶RC等效电路与扩展卡尔曼滤波的SOC估计方法,误差控制在3%以内。双向DC-DC变换器采用状态空间平均建模方法,推导了小信号传递函数,为闭环控制提供理论基础。该体系实现了从瞬时功率平衡到长期能量调度的多层级协同控制,为微电网稳定运行提供了系统的解决方案。

AI的内部世界的博客 191

C++纯虚函数和派生类用法(抽象基类ABC)

C++中,如果希望有一个公共基类只声明一个函数接口,在该公共基类不进行定义,而是在派生类才重新定义;重新定义时,不同的派生类重新定义不同的功能,则这种情况下,最好使用C++的纯虚函数和派生类。(最后面有源代码下载) 1.1纯虚函数的特点和作用 a1 在基类声明一批公共的函数接口(在函数声明的分号前赋值=0),不进行定义,而在不同的派生类才重新进行定义;(当然,如果需要,也可以在公共基类中进行定...

净无邪博客 4503

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++_类继承5-抽象基类

abstract base class,ABC 抽象基类 有时候is-a规则并不像看上去那么简单,例如圆和椭圆的关系。圆是椭圆的特殊情况。椭圆可以派生出圆。但是椭圆的数据成员及方法对于圆来说是信息冗余。圆类继承椭圆类会显得很繁琐。 如果把圆和椭圆分开定义,这种方法效率不高,因为它忽略了圆类和椭圆类的许多共同点。 还有一种方法:将圆和椭圆的共性抽象出来...

weixin_33898876的博客 241

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++PrimerPlus:第十三章类和继承:ABC理念

1,对ABC的的设计方法。需要多练习。

zhyjhacker的博客 315

【和春笋一起学C++】(六十六)抽象基类与纯虚函数

本文介绍了C++中虚函数、纯虚函数和抽象基类(ABC)的概念及应用。通过圆和椭圆的几何图形类示例,展示了如何将共性方法和数据提取到抽象基类中。抽象基类包含纯虚函数(如Area()),不能实例化,必须通过派生类(如Circle和Ellipse)实现具体功能。这种设计规范了接口规则,强制派生类遵循统一接口,体现了基于组件的编程思想,确保所有派生类至少支持基类指定的功能。

计算机视觉算法开发与落地 277

抽象基类

抽象基类 抽象基类的出现是因为,is-a规则并不是十全十美的,比如一个椭圆类派生出圆类,圆的实现比椭圆简单很多,只需要一个半径就可以描述出来,但是呢,椭圆作为基类需要描述长轴,短轴之类的. 所以通过以上例子可以看出,is-a并不是完美的,若果将各个类中重复最多的数据和接口抽象出来,组成一个基类,被称为抽象基类(ABC),这个抽象基类可以作为派生出子类,更加适合. 利用ABC这种方式,将园和椭圆中共性放在与一个ABC中,但是,其中有些方法不能是共有实现的,比如计算面积是不能通用的.所以c++提供了一种将不能实

liutao43的博客 921

python abc模块_Python中的abc模块

前言在《抽象基类(ABC)》中,基于C++讲述抽象基类。尽管Python设计上以鸭子类型为主,但仍有抽象基类(ABC)的一席之地,它被封装在了abc模块中供程序员使用。abc模块有以下两个主要功能:某种情况下,判定某个对象的类型,如:isinstance(a, Sized)强制子类必须实现某些方法,即ABC类的派生类判断类型当我们判断一个对象是否存在某个方法时,可以使用内置方法hasattr()。...

weixin_39716800的博客 365

八.抽象基类和纯虚函数(C++)

内容参考于《21天学通C++》(第八版) 八.抽象基类和纯虚函数 不能实例化的基类被称为抽象基类, 这样的基类只有一个用途, 那就是从它派生出其他类。 在 C++中,要创建抽象基类,可声明纯虚函数。 1. 示例 #include <iostream> using namespace std; class Fish { public: // define a pure virtual function Swim virtual void Swim() = 0; }; class Tuna.

Trstary的博客 239

Python总结-(抽象基类)

抽象基类(abstract base class, abc)就是类里定义了纯虚成员函数的类。纯虚函数只提供接口,并没有具体实现。抽象基类不能被实例化,通常是作为基类供子类继承,子类中重写虚函数,实现具体的接口 在C++中,派生类需要重写基类中的所有虚函数,不然是无法创建对象的,python怎样实现抽象基类呢? class A(object): def get(self, key): ...

分享与记录 1950

C++PrimerPlus:第十三章类和继承:抽象基类

例如::第十三章类和继承:抽象基类提示:以下是本篇文章正文内容,下面案例可供参考暂无。

zhyjhacker的博客 1198
上一篇: C++模板实现智能数组类
下一篇: VC无闪烁刷屏技术的实现
疯狂-的-蜗牛
博客等级 码龄16年 427粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值