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

抽象基类(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;
}





 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值