第十五章 15.2.2节练习

练习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的实现方式改成这样即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值