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

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

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

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

15.4节 抽象基类 习题答案

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

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

【解答】

#include 
#include 

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 << "nn" << 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 
#include 

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 << "nn" << 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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/4749825.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-08
下一篇 2022-11-08

发表评论

登录后才能评论

评论列表(0条)

保存