由于一个容器只能保存一种类型,所以对于继承的类,需要间接保存,存放指针而不是对象

编写basket类

class Basket
{
public:
    void add_item(const std::shared_ptr<Quote> &sale)
    {
        items.insert(sale);
    }
    double total_receipt(std::ostream&) const;
private:
    static bool compare(const std::shared_ptr<Quote> &lhs, const std::shared_ptr<Quote> &rhs)
    {return lhs->isbn() < rhs->isbn();}
    std::multiset<std::shared_ptr<Quote>, decltype(compare)*> items{compare}; 
};
double Basket::total_receipt(ostream &os) const
{
    double sun = 0.0;
    for(auto iter = items.cbegin(); iter != items.cend(); iter = items.upper_bound(*iter))
    {
        sum += print_total(os, **iter, items.count(*iter));
    }
    os << "Total Sale:" << sum << endl;
    return sum;
}

利用虚拷贝隐藏指针

class Quote
{
public:
    virtual Quote* clone() const &
    {return new Quote(*this);}
    virtual Quote* clone() const &&
    {return new Quote(std::move(*this));}
}
//派生类也如此定义
...

新版本的add_item可以这样写

void add_item(const Quote &sale)
{
    items.insert(std::shared_ptr<Quote>(sale.clone()));
}
void add_item(Quote &&sale)
{
    items.insert(std::shared_ptr<Quote>(std::move(sale).clone()));
}