C++ primer plus第六版课后编程题答案13.3


 

 

abstractABC.cpp

#include <iostream>
#include <string>
using namespace std;
class DMA{
private:
	string label;//为了方便,我直接写出string类型了
	int rating;
public:
	DMA(const string l="null",int r=0){//虚基类也是有构造函数的
		label=l;
		rating=r;
	}virtual void test()const=0{};//只是为了使其成为虚基类
	virtual void tese2(){cout<<"test2";};//只有纯虚函数才要求派生类都实现,虚函数不一定要实现
	DMA(const DMA &rs)
	{
		label=rs.label;
		rating=rs.rating;
	}
	virtual ~DMA()//const=0
	{};
	/*
	DMA &operator=(const DMA &rs)//赋值运算符也是不能被继承的
	{
		return DMA(rs);成为了虚基类之后,就不能创建对象了
	}*/
	string lab(){return label;};
	int ra(){return rating;};

	friend ostream&operator<<(ostream &os,const DMA &rs)//const=0//友元函数是不能被继承的,	
	{													//但是可以通过强制指针转换来调用
		os<<"label:"<<rs.label<<"   rating:"<<rs.rating<<endl;
		return os;
	}
	virtual void show()
	{
		cout<<"label:"<<label<<"   rating:"<<rating<<"   "<<endl;	
	}
};

class baseDMA:public DMA
{
public:
	baseDMA(const string l="null",int r=0):DMA(l,r)
	{}
	baseDMA(baseDMA &bd):DMA(bd.lab(),bd.ra())//不能用const,
	{
	}
	//baseDMA  赋值我就不写了,原理都是差不多的
	virtual void test()const{};//必须实现虚基类的所有虚函数
	virtual ~baseDMA(){}
	friend ostream&operator<<(ostream &os,const baseDMA &bd)
	{
		os<<"This is baseDMA:  ";
		os<<(DMA &)bd;//通过强制类型转换调用基类友元函数
		return os;
	}
	virtual void show()
	{
		cout<<"This is baseDMA:  ";
		DMA::show();	
		cout<<endl;
	}
};

class lacksDMA:public DMA
{
private:
	//enum{COL}
	string color;
public:
	lacksDMA(const string c="blank",const string l="null",int r=0):DMA(l,r)
	{
		color=c;
	}
	virtual ~lacksDMA(){};
	virtual void test()const{};//必须实现虚基类的所有虚函数
	friend ostream&operator<<(ostream &os,const lacksDMA &ld)
	{
		os<<"This is lacksDMA:  ";
		os<<(DMA &)ld<<"  color:"<<ld.color;//通过强制类型转换调用基类友元函数
		return os;
	}
	virtual void show()
	{
		cout<<"This is lacksDMA:  ";
		DMA::show();
		cout<<"  color:"<<color;
		cout<<endl;
	}
};

class hasDMA:public DMA
{
private:
	string style;
public:
	hasDMA(const string s="none",const string l="null",int r=0):DMA(l,r)
	{
		style=s;
	}
	virtual ~hasDMA(){};
	virtual void test()const{};//必须实现虚基类的所有虚函数
	virtual void show()
	{
		cout<<"This is hasDMA:  ";
		DMA::show();	
		cout<<"  style:"<<style;
		cout<<endl;
	}
	friend ostream&operator<<(ostream &os,const hasDMA &hd)
	{
		os<<"This is hasDMA:  ";
		os<<(DMA &)hd<<"  style:"<<hd.style;//通过强制类型转换调用基类友元函数
		return os;
	}

};

main133.cpp

#include <iostream>
#include "abstractABC.cpp"
using namespace std;
void main133()
{
	DMA *pd[3];//虚基类不能创建对象,但可以创建指向其的指针
	for(int i=0;i<3;i++)
	{
		cout<<"\nEnter the label:";
		string label;
		getline(cin,label,'\n');
		cout<<"\nEnter the rating:";
		int rat;
		cin>>rat;
		cout<<"Enter the 1 for baseDMA"<<endl
			<<"2 for lacksDMA"<<endl
			<<"3 for hasDMA"<<endl;
		int temp;
		cin>>temp;
		cin.get();//吸收掉回车符,否则下面的geiline会直接读取这一个回车符

		if(temp==1)
			pd[i]=new baseDMA(label,rat);//如果不实现虚基类的所有纯虚函数,将无法创建该类的实例化
		else if(temp==2)
		{
			cout<<"Enter the color:";
			string color;
			getline(cin,color);
			pd[i]=new lacksDMA(color,label,rat);
		}
		else if(temp==3)
		{
			cout<<"Enter the style:";
			string style;
			getline(cin,style);
			pd[i]=new hasDMA(style,label,rat);
		}
		else
		{
			cout<<"invalid input! try again!"<<endl;
			i--;
		}
		while(cin.get()!='\n')
			continue;
		//getline(label,100,);
		//cin>>label;
	}
	cout<<endl;
	for(int i=0;i<3;i++)
		pd[i]->show();
		//cout<<*pd[i];这样,都只是调用了DMA的友元函数

	system("pause");
}

 

 

 


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注