/****************************************************************************************************************************************************************************************
设计一个基类,让baseDMA、lackDMA、hasDMA都从一个ABC类派生而来,然后使用与程序来测试。也就是说,它应使用ABC指针指数数组,并让用户决定要创建的对象类型。在类定义中添加virtual View()方法以处理数据显示
****************************************************************************************************************************************************************************************/
/**********************************************************************************
DMA.h文件
包括一些主要的类声明、以及方法。提供类的接口
**********************************************************************************/
#include<iostream>
#ifndef DMA_H_
#define DMA_H_
// class dmaABC
class dmaABC
{
private :
char *label ;
int rating ;
public :
dmaABC(const char *l = "null" , int r = 0 ) ;
dmaABC(const dmaABC & rc) ; //copy function
virtual ~dmaABC() { delete [] label ;}
virtual void View() const = 0 ;
} ;
//class baseDMA
class baseDMA : public dmaABC
{
public :
baseDMA(const char *l = "null" , int r = 0 ) ;
~baseDMA() {}
virtual void View() const ;
baseDMA(const baseDMA &rc) ;
};
//class lackDMA
class lackDMA : public dmaABC
{
private :
char color[40] ;
public:
lackDMA(const char *l = "null",const char *c = "nocol" ,int r = 0 ) ;
~lackDMA() { }
lackDMA(const lackDMA &rc) ;
virtual void View() const ;
};
//class hasDMA
class hasDMA : public dmaABC
{
private :
char *style ;
public :
hasDMA(const char *l = "null" ,const char *h = "nosty" ,int r = 0 ) ;
~hasDMA() {delete [] style ;}
hasDMA(const hasDMA &rc) ;
virtual void View() const ;
};
#endif
/*************************************************************************
dma.cpp文件
提供类方法的实现
**************************************************************************/
#include<iostream>
#include"DMA.h"
#include<cstring>
//dmaABC method
dmaABC::dmaABC(const char *l ,int r )
{
int n = 0 ;
n = strlen(l) ;
label = new char [n+1] ;
strncpy(label,l,n+1) ;
label[n] = '\0' ;
rating = r ;
}
dmaABC::dmaABC(const dmaABC &rc)
{
int n = 0 ;
n = strlen(rc.label) ;
label = new char[n+1] ;
strncpy(label,rc.label,n+1) ;
label[n] = '\0' ;
rating = rc.rating ;
}
void dmaABC::View() const
{
using std::cout ;
using std::endl ;
cout << "Label : " << label << endl ;
cout << "Rating " << rating << endl ;
}
//class baseDMA method
baseDMA::baseDMA(const char *l ,int r) : dmaABC(l,r)
{
}
baseDMA::baseDMA(const baseDMA &rc) : dmaABC(rc)
{
}
void baseDMA:: View() const
{
dmaABC::View() ;
}
//class lackDMA method
lackDMA::lackDMA(const char *l,const char *c ,int r):dmaABC(l,r)
{
strncpy(color,c,40) ;
}
lackDMA::lackDMA(const lackDMA &rc) : dmaABC(rc)
{
strncpy(color,rc.color,40) ;
}
void lackDMA::View()const
{
using std::cout ;
using std::endl ;
dmaABC::View() ;
cout << "Color : " << color << endl ;
}
//class hasDMA method
hasDMA::hasDMA(const char *l,const char *h,int r) : dmaABC(l,r)
{
int n = 0 ;
n = strlen(h) ;
style = new char[n+1] ;
strncpy(style,h,n+1) ;
style[n] = '\0' ;
}
hasDMA::hasDMA(const hasDMA &rc) : dmaABC(rc)
{
int n = 0 ;
n = strlen(rc.style) ;
style = new char [n+1] ;
strncpy(style,rc.style,n+1) ;
}
void hasDMA::View()const
{
using std::cout ;
using std::endl ;
dmaABC::View() ;
cout << "Style : " << style << endl ;
}
/******************************************************************
useDMA.cpp
提供测试的代码
*******************************************************************/
#include<iostream>
#include"DMA.h"
const int ITEM = 4 ;
const int LEN = 40 ;
int main(void)
{
using std::cin ;
using std::cout ;
using std::endl ;
dmaABC *Pdma[ITEM] ;
int i = 0 ;
char TempLabel[LEN] ;
int TempRating = 0 ;
char TempColor[LEN] ;
char TempStyle[LEN] ;
int kind = 0 ;
for(i = 0 ; i < ITEM ; i++)
{
cout << "Enter item's label : " ;
cin.getline(TempLabel,LEN) ;
cout << "Enter item's rating : " ;
cin >> TempRating ;
cout << "Enter 1 for baseDMA,2 for lackDMA,3 for hasDMA : " ;
while(cin >> kind && (kind != 1 && kind !=2 && kind != 3))
{
cout << "Enter either 1 , 2 or 3 : " ;
while(cin.get() != '\n')
continue ;
}
cin.get() ; //这里用来吸收回车符的,还有VC++ 6.0下的getline是有BUG的
if(1 == kind)
{
Pdma[i] = new baseDMA(TempLabel,TempRating) ;
}
else if(2 == kind)
{
cout << "Enter item's color : " ;
cin.getline(TempColor,LEN) ;
Pdma[i] = new lackDMA(TempLabel,TempColor,TempRating) ;
}
else
{
cout << "Enter item's styel : " ;
cin.getline(TempStyle,LEN) ;
Pdma[i] = new hasDMA(TempLabel,TempStyle,TempRating) ;
}
while(cin.get() != '\n')
continue ;
}
cout << endl << endl ;
for(i = 0 ; i < ITEM ; i++)
{
Pdma[i]->View() ;
cout << endl ;
}
for(i = 0 ; i < ITEM ; i++)
{
delete Pdma[i] ;
}
cout << "\nDone.\n" ;
return 0 ;
}