C++Primer15.2.2节练习

文章展示了C++中类的继承和派生概念,包括基类和派生类的定义、构造函数的使用,以及如何通过覆盖基类函数实现特定的折扣策略。主要讨论了Quote类及其两个派生类Bulk_quote和Limited_quote,这两个派生类分别实现了基于购买数量的折扣和数量限制的折扣策略。
摘要由CSDN通过智能技术生成

练习15.4:

(a):错误,类不能继承本身

(b):正确

(c):错误,类的声明不能有其派生列表

练习15.5:

#include <iostream>
#include <string>
#include <errno.h>
using namespace std;

//基类
class Quote {
public:
	Quote() = default;
	Quote(const std::string& book,double sales_price):bookNo(book),price(sales_price){ }
	std::string isbn()const { return bookNo; }
	virtual double net_price(std::size_t n)const { return n * price; }
	//对析构函数进行动态绑定
	virtual ~Quote() = default;

private:
	std::string bookNo;

protected:
	double price = 0.0;
};

//派生类
class Bulk_quote :public Quote {
public:
	Bulk_quote() = default;
	Bulk_quote(const std::string&, double, std::size_t, double);
	//覆盖基类的函数版本以实现基于大量购买的折扣政策
	double net_price(std::size_t)const override;
private:
	std::size_t min_qty = 0;
	double discount = 0.0;
};


//派生类的构造函数
Bulk_quote::Bulk_quote(const std::string& book, double p, std::size_t qty, double disc) :Quote(book, p), min_qty(qty), discount(disc)
{

}

//派生类使用基类成员
double Bulk_quote::net_price(size_t cnt)const
{
	if (cnt >= min_qty)
	{
		return cnt * (1 - discount) * price;
	}
	else
	{
		return cnt * price;
	}
}

练习15.6:

测试代码如下:

#include <iostream>
#include <string>
#include <errno.h>
using namespace std;

//基类
class Quote {
public:
	Quote() = default;
	Quote(const std::string& book,double sales_price):bookNo(book),price(sales_price){ }
	std::string isbn()const { return bookNo; }
	virtual double net_price(std::size_t n)const { return n * price; }
	//对析构函数进行动态绑定
	virtual ~Quote() = default;

private:
	std::string bookNo;

protected:
	double price = 0.0;
};

//派生类
class Bulk_quote :public Quote {
public:
	Bulk_quote() = default;
	Bulk_quote(const std::string&, double, std::size_t, double);
	//覆盖基类的函数版本以实现基于大量购买的折扣政策
	double net_price(std::size_t)const override;
private:
	std::size_t min_qty = 0;
	double discount = 0.0;
};


//派生类的构造函数
Bulk_quote::Bulk_quote(const std::string& book, double p, std::size_t qty, double disc) :Quote(book, p), min_qty(qty), discount(disc)
{

}

//派生类使用基类成员
double Bulk_quote::net_price(size_t cnt)const
{
	if (cnt >= min_qty)
	{
		return cnt * (1 - discount) * price;
	}
	else
	{
		return cnt * price;
	}
}


//计算并打印销售给定数量的某种书籍所得的费用
double print_total(ostream& os, const Quote& item, size_t n)
{
	double ret = item.net_price(n);
	os << "ISBN:" << item.isbn() << " #sold: " << n << "total due: " << ret << endl;
	return ret;
}



//测试
int main()
{
	//创建Quote类对象
	Quote q("hello C++", 19.9);
	//传递给print_total函数
	print_total(cout, q, 20);
	
	//创建Bulk_quote类对象
	Bulk_quote bq("hello Java", 19.9, 15, 0.3);
	print_total(cout, bq, 20);

	system("pause");
	return 0;
}

结果如下:

 由结果可知函数正确

练习15.7:

#include <iostream>
#include <string>
#include <errno.h>
using namespace std;

//基类
class Quote {
public:
	Quote() = default;
	Quote(const std::string& book,double sales_price):bookNo(book),price(sales_price){ }
	std::string isbn()const { return bookNo; }
	virtual double net_price(std::size_t n)const { return n * price; }
	//对析构函数进行动态绑定
	virtual ~Quote() = default;

private:
	std::string bookNo;

protected:
	double price = 0.0;
};

//派生类
class Bulk_quote :public Quote {
public:
	Bulk_quote() = default;
	Bulk_quote(const std::string&, double, std::size_t, double);
	//覆盖基类的函数版本以实现基于大量购买的折扣政策
	double net_price(std::size_t)const override;
private:
	std::size_t min_qty = 0;
	double discount = 0.0;
};


//数量受限的折扣策略类
class Limited_quote :public Quote {
public:
	//构造函数
	Limited_quote() = default;
	Limited_quote(const std::string&, double, std::size_t, double);
	//覆盖基类的函数版本以实现基于大量购买的折扣政策
	double net_price(std::size_t)const override;


private:
	//享受折扣的书籍数量上限
	std::size_t max_qty = 0;
	double discount = 0.0;
};

//构造函数
Limited_quote::Limited_quote(const std::string& s, double p, std::size_t m_qty, double disc) :Quote(s, p), max_qty(m_qty), discount(disc)
{

}


//派生类使用基类成员
double Limited_quote::net_price(size_t cnt)const
{
	if (cnt <= max_qty)
	{
		return cnt * (1 - discount) * price;
	}
	else
	{
		return (cnt - max_qty) * price + max_qty * (1 - discount) * price;
	}
}


//计算并打印销售给定数量的某种书籍所得的费用
double print_total(ostream& os, const Quote& item, size_t n)
{
	double ret = item.net_price(n);
	os << "ISBN:" << item.isbn() << " #sold: " << n << "total due: " << ret << endl;
	return ret;
}



//测试
int main()
{
	//创建Quote类对象
	Quote q("hello C++", 19.9);
	//传递给print_total函数
	print_total(cout, q, 20);
	
	//创建Limited_quote类对象
	Limited_quote lmq("hello Java", 19.9, 15, 0.3);
	//传递给print_total函数
	print_total(cout, lmq, 20);

	system("pause");
	return 0;
}

结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学C++.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值