如何通过父类数组指针调用子类私有函数

题目

某顾客到商店购买生活物品,购买:米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);
	
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值