C++ Primer 学习笔记_71_面向对象编程 --句柄类与继承(二)

2014-11-24 12:54:59 · 作者: · 浏览: 1
或引用)。 */ virtual Bulk_item *clone() const { return new Bulk_item(*this); } };

定义句柄构造函数

Sales_item::Sales_item(const Item_base &rhs):
    p(rhs.clone()),use(new size_t(1)) {}

它调用形参的clone产生那个对象的(虚)副本:如果实参是Item_base对象,则运行Item_base的clone函数;如果实参是Bulk_item对象,则执行Bulk_item的clone函数。

//P508 习题15.31
class Lds_item : public Item_base
{
public:
    virtual Lds_item *clone() const
    {
        return new Lds_item(*this);
    }

    //...As before
};

//习题15.32/34
//(a)
class Item_base
{
public:
    Item_base(const std::string &book = "",
              double sales_price = 0.0):
        isbn(book),price(sales_price) {}
    virtual void debug(bool ctrl = 1,ostream &os = cout) const
    {
        if (!ctrl)
            return;

        os << "ISBN:\t" << isbn << endl
           << "price:\t" << price << endl;
    }

private:
    std::string isbn;

protected:
    double price;
};

class Disc_item : public Item_base
{
public:
    Disc_item(const std::string &book = "",
              double sales_price = 0.0,
              std::size_t qty = 0,
              double disc_rate = 0.0):
        Item_base(book,sales_price),quantity(qty),discount(disc_rate) {}


    virtual void debug(bool ctrl = 1,ostream &os = cout) const
    {
        if (!ctrl)
            return ;

        Item_base::debug(os);
        os << "quantity:\t" << quantity << endl
           << "discount:\t" << discount << endl;
    }

protected:
    std::size_t quantity;   //可实行折扣的数量
    double discount;        //折扣率
};


//(b)
class Item_base
{
public:
    Item_base(const std::string &book = "",
              double sales_price = 0.0,
              bool dbg = false):
        isbn(book),price(sales_price),is_debug(dbg) {}
    virtual void debug(ostream &os = cout) const
    {
        if (!is_debug)
            return;

        os << "ISBN:\t" << isbn << endl
           << "price:\t" << price << endl;
    }

    void set_debug(bool dbg)
    {
        is_debug = dbg;
    }

private:
    std::string isbn;

protected:
    double price;
    bool is_debug;
};

class Disc_item : public Item_base
{
public:
    Disc_item(const std::string &book = "",
              double sales_price = 0.0,
              std::size_t qty = 0,
              double disc_rate = 0.0,
              bool dbg = false):
        Item_base(book,sales_price,dbg),quantity(qty),discount(disc_rate) {}


    virtual void debug(ostream &os = cout) const
    {
        if (!is_debug)
            return ;

        Item_base::debug(os);
        os << "quantity:\t" << quantity << endl
           << "discount:\t" << discount << endl;
    }

protected:
    std::size_t quantity;   //可实行折扣的数量
    double discount;        //折扣率
};

class Bulk_item : public Disc_item
{
public:
    Bulk_item(const std::string &book = "",
              double sales_price = 0.0,
              std::size_t qty = 0,
              double disc_rate = 0.0,
              bool dbg = false):
        Disc_item(book,sales_price,qty,disc_rate,dbg) {}
};

class Lds_item : public Disc_item
{
public:
    Lds_item(const std::string &book = "",
             double sales_price = 0.0,
             std::size_t qty = 0,
             double disc_rate = 0.0,
             bool dbg = false):
        Disc_item(book,sales_price,qty,disc_rate,dbg) {}
};