《C++ Primer》第15章 面向对象程序设计
15.4节 抽象基类 习题答案
练习15.15:定义你自己的Disc_quote和Bulk_quote。
【出题思路】本题练习实现不同折扣策略。
【解答】
#include#include using std::cout; using std::endl; using std::string; class Quote { public: Quote() = default; Quote(const std::string &book, double sales_price): bookNo(book), price(sales_price) { } std::string isbn() const { return bookNo; } //返回给定数量的书籍的销售总额,派生类改写并使用不同的折扣计算方法 virtual double net_price(std::size_t n) const { return n * price; } virtual void debug() { cout << "bookNo=" << bookNo << " price=" << price << endl; } virtual ~Quote() = default;//对析构函数进行动态绑定 private: std::string bookNo;//书籍的ISBN编号 protected: double price = 0.0;//代表普通状态下不打折的价格 }; double print_total(std::ostream &os, const Quote &item, size_t n) { //根据传入item形参的对象类型调用Quote::net_price或者Bulk_quote::net_price double ret = item.net_price(n); os << "ISBN:" << item.isbn() << " # sold:" << n << " total due: " << ret << endl; return ret; } class Disc_quote: public Quote { public: Disc_quote(const string &book = "", double sales_price = 0.0, size_t qty = 0, double disc = 0.0) :Quote(book, sales_price), quantity(qty), discount(disc) { } //这样写的虚函数属性继承Quote,最好还是在前面加上virtual这样使代码更清晰,如果把基类的virtula关键字去掉,这样写会报错 //double net_price(size_t cnt) const = 0; virtual double net_price(size_t cnt) const = 0; protected: size_t quantity; double discount; }; class Bulk_quote: public Disc_quote { public: Bulk_quote() = default; //书号, 售价,适用折扣政策的最低购买量,折扣额 Bulk_quote(const std::string &book = "", double sales_price = 0, size_t qty = 0, double disc_rate = 0) :Disc_quote(book, sales_price, qty, disc_rate) { min_qty = qty; discount = disc_rate; } //覆盖基类的函数版本以实现基于大量购买的折扣政策 double net_price(size_t cnt) const override //如果不加override,net_price这个函数也是虚函数 p528 { if(cnt >= min_qty) { return cnt * discount * price; } else { return cnt * price; } } virtual void debug() override { Quote::debug();//bookNo变量为private,所以不能直接访问bookNo只能调用基类的debug()函数来显示 cout << "min_qty=" << min_qty << " discount=" << discount << endl; } private: size_t min_qty;//适用折扣政策的最低购买量 double discount;//以小数表示的折扣额 }; int main() { Quote quote("XC4390", 80); //cout是ostream的对象 print_total(cout, quote, 8); quote.debug(); cout << "nn" << endl; Bulk_quote bulk_quote("XC4390", 80, 8, 0.8); print_total(cout, bulk_quote, 8); bulk_quote.debug(); std::cout << "Hello, World!n"; return 0; }
运行结果:
练习15.16:改写你在15.2.2节(第533页)练习中编写的数量受限的折扣策略,令其继承Disc_quote。
【出题思路】
本题练习折扣策略函数覆盖 *** 作。
【解答】
#include#include using std::cout; using std::endl; using std::string; class Quote { public: Quote() = default; Quote(const std::string &book, double sales_price): bookNo(book), price(sales_price) { } std::string isbn() const { return bookNo; } //返回给定数量的书籍的销售总额,派生类改写并使用不同的折扣计算方法 virtual double net_price(std::size_t n) const { return n * price; } virtual void debug() { cout << "bookNo=" << bookNo << " price=" << price << endl; } virtual ~Quote() = default;//对析构函数进行动态绑定 private: std::string bookNo;//书籍的ISBN编号 protected: double price = 0.0;//代表普通状态下不打折的价格 }; double print_total(std::ostream &os, const Quote &item, size_t n) { //根据传入item形参的对象类型调用Quote::net_price或者Bulk_quote::net_price double ret = item.net_price(n); os << "ISBN:" << item.isbn() << " # sold:" << n << " total due: " << ret << endl; return ret; } class Disc_quote: public Quote { public: Disc_quote(const string &book = "", double sales_price = 0.0, size_t qty = 0, double disc = 0.0) :Quote(book, sales_price), quantity(qty), discount(disc) { } //这样写的虚函数属性继承Quote,最好还是在前面加上virtual这样使代码更清晰,如果把基类的virtula关键字去掉,这样写会报错 virtual double net_price(size_t cnt) const = 0; protected: size_t quantity; double discount; }; class Limite_quote: public Disc_quote { public: Limite_quote() = default; //书号, 售价,适用折扣政策的最低购买量,折扣额 Limite_quote(const std::string &book = "", double sales_price = 0, size_t qty = 0, double disc_rate = 0) :Disc_quote(book, sales_price, qty, disc_rate) { min_qty = qty; discount = disc_rate; } //覆盖基类的函数版本以实现基于大量购买的折扣政策 double net_price(size_t cnt) const override //如果不加override,net_price这个函数也是虚函数 p528 { if(cnt <= min_qty) { return cnt * discount * price; } else { return quantity * discount * price + (cnt - min_qty) * price; } } virtual void debug() override { Quote::debug();//bookNo变量为private,所以不能直接访问bookNo只能调用基类的debug()函数来显示 cout << "min_qty=" << min_qty << " discount=" << discount << endl; } private: size_t min_qty;//适用折扣政策的最低购买量 double discount;//以小数表示的折扣额 }; int main() { Quote quote("NO239", 50); //cout是ostream的对象 print_total(cout, quote, 8); quote.debug(); cout << "nn" << endl; Limite_quote limite_quote("NO239", 50, 8, 0.8); print_total(cout, limite_quote, 8); print_total(cout, limite_quote, 9); limite_quote.debug(); std::cout << "Hello, World!n"; return 0; }
运行结果:
练习15.17:尝试定义一个Disc_quote的对象,看看编译器给出的错误信息是什么?
【出题思路】不能创建抽象基类的对象。
【解答】
报这种编译错误
error: variable type 'Disc_quote' is an abstract class
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)