C++ 多态:Package继承层次

【问题描述】


  • 使用在上篇创建的Package类继承层次结构,创建一个用于显示若干Package的地址信息并计算其运输费用的程序。
  • 程序应该包含一个Package指针的vector 对象,其中的指针指向TwoDayPackage 对象和OvernightPackage 对象。遍历该vector 对象,多态性地处理这些Package。
  • 对于每个Package调用获取函数,获得发送者和接收者的地址信息,然后打印输出这两个地址,就像它们出现在邮包标签上一样。
  • 此外,调用每个Package的calculateCost成员函数并输出结果。跟踪记录该vector 中所有 Package的总的运输费用,并在循环遍历结束时显示此总费用。

1.创建基类Package

class Package
{
	public://声明为常量引用,使用引用避免copy,使用const能保护数据 
		Package(){}
		Package(const string&,	const string&, const string&, const string&,const string&, int , double , double);
		double getWeight() const;
		double getCostPerOunce() const;
		virtual double calculateCost()
		{
			double transCosts;
			transCosts=weight*costPerOunce;
			return transCosts;
		}
		virtual void get(){}
	protected:
		string senderName;		
		string recipientName;
		string address;
		string city;
		string state;
		int postalCode;
		double weight;
		double costPerOunce;//Cost per ounce每一盎司费用 ;盎司:英美制单位,既是重量单位又是容量单位 
};
2.TwoDayPackage类,继承于Package类
class TwoDayPackage : public Package
{
	public:
		TwoDayPackage(){}
		TwoDayPackage(const string&, const string&, const string&, const string&,const string&, int , double , double, double);
		virtual double calculateCost() //基类的成员函数需要在派生类内声明才可被使用 
		{
			double transCosts;
			
			transCosts = Package::calculateCost()  + surfaceMailCosts;
			
			return transCosts;
		}
		virtual void get()
		{
			cout<<"寄件人信息:"<<endl<<"姓名:"<<senderName <<endl<<"******************"<<endl;
			cout<<"收件人信息:"<<endl<<"姓名:"<<recipientName<<endl <<"地址:"<<address<<" " <<city <<" "<<state<<" " 
				<<endl<<"邮政编号: "<<postalCode <<endl<<"******************"<<endl;
		}
	private:
		double surfaceMailCosts;//平寄费 
};
3.OvernightPackage类,继承于Package类
class OvernightPackage : public Package
{
	public:
		OvernightPackage(){}
		OvernightPackage(const string&, const string&, const string&, const string&,const string&, int , double , double, double);
		virtual double calculateCost() 
		{
			double transCosts;
			
			transCosts = Package::calculateCost()  + extraCosts;
			
			return transCosts;	
		}
		virtual void get()
		{
			cout<<"寄件人信息:"<<endl<<"姓名:"<<senderName <<endl<<"******************"<<endl;
			cout<<"收件人信息:"<<endl<<"姓名:"<<recipientName<<endl <<"地址:"<<address<<" " <<city <<" "<<state<<" " 
				<<endl<<"邮政编号: "<<postalCode <<endl<<"******************"<<endl;
		}
	private:
		double extraCosts;//连夜快递服务的额外费用 
};
4.Package类的方法实现
Package::Package(const string& senderName1,const string& recipientName1, const string& address1, const string& city1,const string& state1,int postalCode1, double weight1, double costPerOunce1) 
: senderName(senderName1),recipientName(recipientName1),address(address1),city(city1),state(state1),postalCode(postalCode1),weight(weight1),costPerOunce(costPerOunce1)
{
	if(weight1>0)
	{
		weight=weight1;	
	}
	else
	{
		weight=1;
		cout << "Weight less than 0 !" << endl;
	}	
} 
double Package::getWeight() const
{
	return weight;
}
double Package::getCostPerOunce() const
{
	return costPerOunce;
}
5.TwoDayPackage类的方法实现
TwoDayPackage::TwoDayPackage(const string& senderName1,const string& recipientName1, const string& address1, const string& city1,const string& state1,int postalCode1, double weight1, double costPerOunce1,double surfaceMailCosts1)
:Package(senderName1,recipientName1,address1,city1,state1,postalCode1,weight1,costPerOunce1)
{																							
	surfaceMailCosts=surfaceMailCosts1; 										
}
6.OvernightPackage类的方法实现
OvernightPackage::OvernightPackage(const string& senderName1,const string& recipientName1, const string& address1, const string& city1,const string& state1,int postalCode1, double weight1, double costPerOunce1,double extraCosts1)
:Package(senderName1,recipientName1,address1,city1,state1,postalCode1,weight1,costPerOunce1)
{
	extraCosts=extraCosts1; 
}

7.测试程序

//测试程序 
int main()
{	
	TwoDayPackage *ptr_Two=new TwoDayPackage("Lihua","Kandy","America","NewYork","NewYorkState",10041,30,5,36.2);
	OvernightPackage *ptr_Over=new OvernightPackage("Zhang shan","Kandy","America","Houston","Texas",77001,50,8,25.6);
	vector <Package*> PackageClass;
	PackageClass.push_back(ptr_Two);
	PackageClass.push_back(ptr_Over);
	vector<Package*>::iterator iter;
	for(iter = PackageClass.begin(); iter != PackageClass.end(); ++iter)
    {
    	cout<<"该快递的具体信息如下:"<<endl; 
        (*iter)->get();
        cout<<"该包裹的运输费用为: "<<(*iter)->calculateCost()<<endl<<endl;
        system("pause");
        system("cls");
    }
	cout<<"程序退出!"<<endl; 
	delete ptr_Two;
	delete ptr_Over;
	return 0;
}

完整的代码如下:

///
//基于Package类继承层次结构
//Package继承层次 
//
#include<iostream>
#include<string>
#include<vector>
#include<windows.h>
using namespace std;
class Package
{
	public://声明为常量引用,使用引用避免copy,使用const能保护数据 
		Package(){}
		Package(const string&,	const string&, const string&, const string&,const string&, int , double , double);
		double getWeight() const;
		double getCostPerOunce() const;
		virtual double calculateCost()
		{
			double transCosts;
			transCosts=weight*costPerOunce;
			return transCosts;
		}
		virtual void get(){}
	protected:
		string senderName;		
		string recipientName;
		string address;
		string city;
		string state;
		int postalCode;
		double weight;
		double costPerOunce;//Cost per ounce每一盎司费用 ;盎司:英美制单位,既是重量单位又是容量单位 
};
class TwoDayPackage : public Package
{
	public:
		TwoDayPackage(){}
		TwoDayPackage(const string&, const string&, const string&, const string&,const string&, int , double , double, double);
		virtual double calculateCost() //基类的成员函数需要在派生类内声明才可被使用 
		{
			double transCosts;
			
			transCosts = Package::calculateCost()  + surfaceMailCosts;
			
			return transCosts;
		}
		virtual void get()
		{
			cout<<"寄件人信息:"<<endl<<"姓名:"<<senderName <<endl<<"******************"<<endl;
			cout<<"收件人信息:"<<endl<<"姓名:"<<recipientName<<endl <<"地址:"<<address<<" " <<city <<" "<<state<<" " 
				<<endl<<"邮政编号: "<<postalCode <<endl<<"******************"<<endl;
		}
	private:
		double surfaceMailCosts;//平寄费 
};
class OvernightPackage : public Package
{
	public:
		OvernightPackage(){}
		OvernightPackage(const string&, const string&, const string&, const string&,const string&, int , double , double, double);
		virtual double calculateCost() 
		{
			double transCosts;
			
			transCosts = Package::calculateCost()  + extraCosts;
			
			return transCosts;	
		}
		virtual void get()
		{
			cout<<"寄件人信息:"<<endl<<"姓名:"<<senderName <<endl<<"******************"<<endl;
			cout<<"收件人信息:"<<endl<<"姓名:"<<recipientName<<endl <<"地址:"<<address<<" " <<city <<" "<<state<<" " 
				<<endl<<"邮政编号: "<<postalCode <<endl<<"******************"<<endl;
		}
	private:
		double extraCosts;//连夜快递服务的额外费用 
};
Package::Package(const string& senderName1,const string& recipientName1, const string& address1, const string& city1,const string& state1,int postalCode1, double weight1, double costPerOunce1) 
: senderName(senderName1),recipientName(recipientName1),address(address1),city(city1),state(state1),postalCode(postalCode1),weight(weight1),costPerOunce(costPerOunce1)
{
	if(weight1>0)
	{
		weight=weight1;	
	}
	else
	{
		weight=1;
		cout << "Weight less than 0 !" << endl;
	}	
} 
double Package::getWeight() const
{
	return weight;
}
double Package::getCostPerOunce() const
{
	return costPerOunce;
}

TwoDayPackage::TwoDayPackage(const string& senderName1,const string& recipientName1, const string& address1, const string& city1,const string& state1,int postalCode1, double weight1, double costPerOunce1,double surfaceMailCosts1)
:Package(senderName1,recipientName1,address1,city1,state1,postalCode1,weight1,costPerOunce1)
{																							
	surfaceMailCosts=surfaceMailCosts1; 										
}


OvernightPackage::OvernightPackage(const string& senderName1,const string& recipientName1, const string& address1, const string& city1,const string& state1,int postalCode1, double weight1, double costPerOunce1,double extraCosts1)
:Package(senderName1,recipientName1,address1,city1,state1,postalCode1,weight1,costPerOunce1)
{
	extraCosts=extraCosts1; 
}	
//测试程序 
int main()
{	
	TwoDayPackage *ptr_Two=new TwoDayPackage("Lihua","Kandy","America","NewYork","NewYorkState",10041,30,5,36.2);
	OvernightPackage *ptr_Over=new OvernightPackage("Zhang shan","Kandy","America","Houston","Texas",77001,50,8,25.6);
	vector <Package*> PackageClass;
	PackageClass.push_back(ptr_Two);
	PackageClass.push_back(ptr_Over);
	vector<Package*>::iterator iter;
	for(iter = PackageClass.begin(); iter != PackageClass.end(); ++iter)
    {
    	cout<<"该快递的具体信息如下:"<<endl; 
        (*iter)->get();
        cout<<"该包裹的运输费用为: "<<(*iter)->calculateCost()<<endl<<endl;
        system("pause");
        system("cls");
    }
	cout<<"程序退出!"<<endl; 
	delete ptr_Two;
	delete ptr_Over;
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值