//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'
15.4. Abstract Base Classes
最新推荐文章于 2024-03-10 21:16:10 发布