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