练习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;
}
结果: