练习15.4
下面哪条声明语句是不正确的?请解释原因。
class Base{ ... };
(a) class Derived : public Derived { ... };
(b) class Derived : private Base { ... };
(c) class Derived : public Base;
解答:
(a) 错误,不能继承自己。这样编译器会提示类型不完整,无法进行编译。
(b) 正确
(c) 错误,派生列表不能出现在类的声明中。
练习15.5
定义你自己的Bulk_quote类。
解答:
这个可以参考书中529页的实现。
练习15.6
将Quote和Bulk_quote的对象传给15.2.1节(第529页)练习中的print_total函数,检查该函数是否正确。
解答:
#include <iostream>
#include <string>
class Quote {
public:
Quote() = default;
Quote(const std::string &book, double sales_price):
bookNo(book), price(sales_price) { }
virtual ~Quote() = default; // dynamic binding for the destructor
std::string isbn() const { return bookNo; }
virtual double net_price(std::size_t n) const { return n * price; }
private:
std::string bookNo; // ISBN number of this item
protected:
double price = 0.0; // normal, undiscounted price
};
class Bulk_quote : public Quote{
public:
Bulk_quote() = default;
Bulk_quote(const std::string &book, double sales_price, std::size_t n, double dis):
Quote(book, sales_price), min_qty(n), discount(dis){}
double net_price(std::size_t cnt) const override {
if (cnt >= min_qty){
return cnt * discount * price;
} else {
return cnt * price;
}
}
private:
std::size_t min_qty = 0;
double discount = 0.0;
};
double print_total(std::ostream &os, const Quote &item, std::size_t n){
double ret = item.net_price(n);
os << "ISBN: " << item.isbn() << " # sold: " << n << " total due: " << ret << std::endl;
return ret;
}
int main(){
Quote quote("book1", 12.2);
Bulk_quote bulk("book2", 12.4, 10, 0.9);
print_total(std::cout, quote, 10);
print_total(std::cout, bulk, 10);
}
改了一下Bulk_quote中net_price的实现方式,让其适合中国打折的方式 XD
练习15.7
定义一个类使其实现一种数量受限的折扣策略,具体策略是:当购买书籍的数量不超过一个给定的限量时享受折扣,如果购买量超过了限量,则超出的部分将以原价销售。
解答:
double net_price(std::size_t cnt) const override {
if (cnt > min_qty){
return min_qty * discount * price + (cnt - min_qty) * price;
} else {
return cnt * price * discount;
}
}
将上题中Bulk_quote中net_price的实现方式改成这样即可。