15.4. Abstract Base Classes

来源:互联网 发布:linux强制删除用户 编辑:程序博客网 时间:2024/06/03 00:33
//Exercises Section 15.4//Exercise 15.15: Define your own versions of Disc_quote and//Bulk_quote.//Exercise 15.16: Rewrite the class representing a limited discount strategy,//which you wrote for the exercises in § 15.2.2 (p. 601), to inherit from//Disc_quote.class Quote {public:    Quote() = default;    Quote(const string &book, double sales_price): bookNo(book), price(sales_price) { }    string isbn() const { return bookNo; }    virtual double net_price(size_t n) const { return n * price; }    virtual ~Quote() = default;private:    string bookNo;protected:    double price = 0.0;};class Disc_quote : public Quote {public:    Disc_quote() = default;    Disc_quote(const string &b, double p, size_t qty, double disc) :    Quote(b, p), quantity(qty), discount(disc) { }    virtual double net_price(size_t n) const = 0;protected:    size_t quantity = 0;    double discount = 0.0;};class Bulk_quote : public Disc_quote {public:    Bulk_quote() = default;    Bulk_quote(const string &book, double p, size_t qty, double dis) :    Disc_quote(book, p, qty, dis) { }    double net_price(size_t cnt) const override {        if(cnt >= quantity) return cnt * (1 - discount) * price;        else return cnt * price;    }};class Limited_quote : public Disc_quote {public:    Limited_quote() = default;    Limited_quote(const string &book, double p, size_t qty, double dis): Disc_quote(book, p, qty, dis) { }    double net_price(size_t n) const override {        if(n <= quantity) return n*(1-discount) * price;        else return n * price;    }};double print_total(ostream &os, const Quote &item, size_t n) {    double ret = item.net_price(n);    os << "ISBN: " << item.isbn() << " # sold: " << n << " total due: " << ret << endl;    return ret;}int main() {    //Disc_quote dq;    Quote q("12-34-45678", 10);    Bulk_quote bq("12-34-45678", 10, 10, 0.2);    Limited_quote lq("12-34-45678", 10, 10, 0.2);    print_total(cout, q, 10);    print_total(cout, bq, 10);    print_total(cout, lq, 10);    return 0;}//Exercise 15.17: Try to define an object of type Disc_quote and see what//errors you get from the compiler.//error: cannot declare variable 'dq' to be of abstract type 'Disc_quote'

原创粉丝点击