题目
某顾客到商店购买生活物品,购买:米5斤每斤2.4元,猪肉2斤每斤10元,油一壶50元,请设计一段程序实现顾客购物清单及总价的计算及显示,具体要求如下:
(1)编写一个抽象类Goods,在public中包含两个纯虚函数goodsprice与show;
(2)编写三个类rice、pork、oil,公共继承Goods类;且每个类都两个私有属性weight,price分别表示单位及单位价格,有一个私有goodsprice函数计算商品价格:weight*price;有一个公有函数show显示商品的价格;
(3)编写一个total函数计算所有商品总价;
(4)编写main函数显示所有商品的价格及总价。
难点:
float total(Goods *a[],int n)
{
float s;
for(int i =0;i<n;i++)
{
s+=a[i]->goodsprice();
}
return s;
}
int main(void)
{
Goods *a[3];
rice b(5,2.4);
a[0]=&b;
a[0]->show();
pork c(2,10);
a[1]=&c;
a[1]->show();
oil d(1,50);
a[2]=&d;
a[2]->show();
cout<<"总价:"<<total(&a[0],3);
}
为什么可以调用子类私有的goodsprice函数
在这段代码中。实际上,
i
是用来循环遍历a[]
数组中的每个元素,而每个元素都是Goods
类的指针。在循环中,通过
a[i]
可以访问a[]
数组中的每个对象。由于a[]
中的元素实际上是指向子类对象的指针,因此可以通过这些指针来调用子类的公共函数。在这里,
a[i]->goodsprice()
是调用了指针a[i]
所指向对象的goodsprice
函数。由于goodsprice
函数在子类中被声明为私有的,因此在Goods
类中无法直接访问。但是,由于子类的对象指针可以赋值给父类的指针,所以在Goods
类中的指针可以调用指向子类对象的成员函数。
完整代码
//. 某顾客到商店购买生活物品,购买:米5斤每斤2.4元,猪肉2斤每斤10元,油一壶50元,请设计一段程序实现顾客购物清单及总价的计算及显示,具体要求如下:
//(1)编写一个抽象类Goods,在public中包含两个纯虚函数goodsprice与show;
//(2)编写三个类rice、pork、oil,公共继承Goods类;且每个类都两个私有属性weight,price分别表示单位及单位价格,有一个私有goodsprice函数计算商品价格
//:weight*price;有一个公有函数show显示商品的价格;
//(3)编写一个total函数计算所有商品总价;
//(4)编写main函数显示所有商品的价格及总价。
#include <iostream>
using namespace std;
class Goods
{
public:
virtual float goodsprice()=0;
virtual void show()=0;
};
class rice :public Goods
{
public:
rice(int w,float p)
{
weight=w;
price=p;
}
void show()
{
cout<<"米饭价格:"<<this->goodsprice()<<endl;
}
private:
float goodsprice()
{
return weight*price;
}
int weight;
float price;
};
class pork :public Goods
{
public:
pork(int w,float p)
{
weight=w;
price=p;
}
void show()
{
cout<<"猪肉价格:"<<this->goodsprice()<<endl;
}
private:
float goodsprice()
{
return weight*price;
}
int weight;
float price;
};
class oil :public Goods
{
public:
oil(int w,float p)
{
weight=w;
price=p;
}
void show()
{
cout<<"油价格:"<<this->goodsprice()<<endl;
}
private:
float goodsprice()
{
return weight*price;
}
int weight;
float price;
};
float total(Goods *a[],int n)
{
float s;
for(int i =0;i<n;i++)
{
s+=a[i]->goodsprice();
}
return s;
}
int main(void)
{
Goods *a[3];
rice b(5,2.4);
a[0]=&b;
a[0]->show();
pork c(2,10);
a[1]=&c;
a[1]->show();
oil d(1,50);
a[2]=&d;
a[2]->show();
cout<<"总价:"<<total(&a[0],3);
}