定义句柄构造函数
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) {}
};