《C++ Primer》第15章 15.4节习题答案

《C++ Primer》第15章 面向对象程序设计

15.4节 抽象基类 习题答案

练习15.15:定义你自己的Disc_quote和Bulk_quote。

【出题思路】本题练习实现不同折扣策略。

【解答】

#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

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 void debug()
    {
        cout << "bookNo=" << bookNo << " price=" << price << endl;
    }
    virtual ~Quote() = default;//对析构函数进行动态绑定

private:
    std::string bookNo;//书籍的ISBN编号

protected:
    double price = 0.0;//代表普通状态下不打折的价格
};

double print_total(std::ostream &os, const Quote &item, size_t n)
{
    //根据传入item形参的对象类型调用Quote::net_price或者Bulk_quote::net_price
    double ret = item.net_price(n);
    os << "ISBN:" << item.isbn() << " # sold:" << n << " total due: " << ret << endl;
    return ret;
}

class Disc_quote: public Quote
{
public:
    Disc_quote(const string &book = "", double sales_price = 0.0, size_t qty = 0, double disc = 0.0)
    :Quote(book, sales_price), quantity(qty), discount(disc)
    {

    }
    //这样写的虚函数属性继承Quote,最好还是在前面加上virtual这样使代码更清晰,如果把基类的virtula关键字去掉,这样写会报错
    //double net_price(size_t cnt) const = 0;
    virtual double net_price(size_t cnt) const = 0;

protected:
    size_t quantity;
    double discount;
};

class Bulk_quote: public Disc_quote
{
public:
    Bulk_quote() = default;
    //书号, 售价,适用折扣政策的最低购买量,折扣额
    Bulk_quote(const std::string &book = "", double sales_price = 0, size_t qty = 0, double disc_rate = 0)
    :Disc_quote(book, sales_price, qty, disc_rate)
    {
        min_qty = qty;
        discount = disc_rate;
    }
    //覆盖基类的函数版本以实现基于大量购买的折扣政策
    double net_price(size_t cnt) const override //如果不加override,net_price这个函数也是虚函数 p528
    {
        if(cnt >= min_qty)
        {
            return cnt * discount * price;
        }
        else
        {
            return cnt * price;
        }
    }

    virtual void debug() override
    {
        Quote::debug();//bookNo变量为private,所以不能直接访问bookNo只能调用基类的debug()函数来显示
        cout << "min_qty=" << min_qty << "  discount=" << discount << endl;
    }

private:
    size_t min_qty;//适用折扣政策的最低购买量
    double discount;//以小数表示的折扣额
};

int main()
{
    Quote quote("XC4390", 80);
    //cout是ostream的对象
    print_total(cout, quote, 8);
    quote.debug();
    cout << "\n\n" << endl;

    Bulk_quote bulk_quote("XC4390", 80, 8, 0.8);
    print_total(cout, bulk_quote, 8);
    bulk_quote.debug();

    std::cout << "Hello, World!\n";
    return 0;
}

运行结果:

 

练习15.16:改写你在15.2.2节(第533页)练习中编写的数量受限的折扣策略,令其继承Disc_quote。

【出题思路】

本题练习折扣策略函数覆盖操作。

【解答】

#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

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 void debug()
    {
        cout << "bookNo=" << bookNo << " price=" << price << endl;
    }
    virtual ~Quote() = default;//对析构函数进行动态绑定

private:
    std::string bookNo;//书籍的ISBN编号

protected:
    double price = 0.0;//代表普通状态下不打折的价格
};

double print_total(std::ostream &os, const Quote &item, size_t n)
{
    //根据传入item形参的对象类型调用Quote::net_price或者Bulk_quote::net_price
    double ret = item.net_price(n);
    os << "ISBN:" << item.isbn() << " # sold:" << n << " total due: " << ret << endl;
    return ret;
}

class Disc_quote: public Quote
{
public:
    Disc_quote(const string &book = "", double sales_price = 0.0, size_t qty = 0, double disc = 0.0)
    :Quote(book, sales_price), quantity(qty), discount(disc)
    {

    }
    //这样写的虚函数属性继承Quote,最好还是在前面加上virtual这样使代码更清晰,如果把基类的virtula关键字去掉,这样写会报错
    virtual double net_price(size_t cnt) const = 0;

protected:
    size_t quantity;
    double discount;
};

class Limite_quote: public Disc_quote
{
public:
    Limite_quote() = default;
    //书号, 售价,适用折扣政策的最低购买量,折扣额
    Limite_quote(const std::string &book = "", double sales_price = 0, size_t qty = 0, double disc_rate = 0)
    :Disc_quote(book, sales_price, qty, disc_rate)
    {
        min_qty = qty;
        discount = disc_rate;
    }
    //覆盖基类的函数版本以实现基于大量购买的折扣政策
    double net_price(size_t cnt) const override //如果不加override,net_price这个函数也是虚函数 p528
    {
        if(cnt <= min_qty)
        {
            return cnt * discount * price;
        }
        else
        {
            return quantity * discount * price + (cnt - min_qty) * price;
        }
    }

    virtual void debug() override
    {
        Quote::debug();//bookNo变量为private,所以不能直接访问bookNo只能调用基类的debug()函数来显示
        cout << "min_qty=" << min_qty << "  discount=" << discount << endl;
    }

private:
    size_t min_qty;//适用折扣政策的最低购买量
    double discount;//以小数表示的折扣额
};

int main()
{
    Quote quote("NO239", 50);
    //cout是ostream的对象
    print_total(cout, quote, 8);
    quote.debug();
    cout << "\n\n" << endl;

    Limite_quote limite_quote("NO239", 50, 8, 0.8);
    print_total(cout, limite_quote, 8);
    print_total(cout, limite_quote, 9);
    limite_quote.debug();

    std::cout << "Hello, World!\n";
    return 0;
}

运行结果:

 

练习15.17:尝试定义一个Disc_quote的对象,看看编译器给出的错误信息是什么?

【出题思路】不能创建抽象基类的对象。

【解答】

报这种编译错误

 error: variable type 'Disc_quote' is an abstract class

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值