《C++ Primer》第15章 面向对象程序设计

15.4节 抽象基类 习题答案

练习15.15:定义你自己的Disc_quote和Bulk_quote。

【出题思路】本题练习实现不同折扣策略。

【解答】

#include <iostream>
#include <string>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_pricedouble 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 << "\n\n" << 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 <iostream>
#include <string>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_pricedouble 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 << "\n\n" << 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

《C++ Primer》第15章 15.4节习题答案相关推荐

  1. 《C++ Primer》第14章 14.3节习题答案

    <C++ Primer>第14章 操作重载与类型转换 14.3节  算术和关系运算符  习题答案 练习14.13:你认为Sales_data类还应该支持哪些其他算术运算符(参见表4.1,第 ...

  2. 《C++ Primer》第12章 12.3节习题答案

    <C++ Primer>第12章 动态内存 12.3节使用标准库:文本查询程序 习题答案 练习12.27:TextQuery和QueryResult类只使用了我们已经介绍过的语言和标准库特 ...

  3. 《C++ Primer》第9章 9.3节习题答案

    <C++ Primer>第9章 顺序容器 9.3节顺序容器操作习题答案 练习9.18:编写程序,从标准输入读取string序列,存入一个deque中.编写一个循环,用迭代器打印deque中 ...

  4. 《C++ Primer》第13章 13.5节习题答案

    <C++ Primer>第13章 拷贝控制 13.5节 动态内存管理类 习题答案 练习13.39:编写你自己版本的StrVec,包括自己版本的reserve.capacity(参见9.4节 ...

  5. 《C++ Primer》第5章 5.2节习题答案

    <C++ Primer>第5章 语句 5.2节 语句作用域 练习5.4:说明下列例子的含义,如果存在问题,试着修改它. (a)while(string::iterator iter != ...

  6. C++ Primer - 5th Edition - 书中源代码 - 课后习题答案

    C++ Primer - 5th Edition - 书中源代码 - 课后习题答案 C++ Primer - 5th Edition - 书中源代码 - 课后习题答案 1. C++ Primer, 5 ...

  7. matlab第三章题目,第3章 MATLAB矩阵处理习题答案

    <第3章 MATLAB矩阵处理习题答案>由会员分享,可在线阅读,更多相关<第3章 MATLAB矩阵处理习题答案(3页珍藏版)>请在人人文库网上搜索. 1.第3章 MATLAB矩 ...

  8. 浙大版《C语言程序设计》第四版(何钦铭颜晖) 第4章 循环结构 课后习题答案

    浙大版<C语言程序设计>第四版(何钦铭颜晖) 第4章 循环结构 课后习题答案 你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解, ...

  9. 软件工程 科学出版社 郑逢斌主编 第1章 软件工程概述 课后习题答案

    软件工程 科学出版社 郑逢斌 第1章 软件工程概述 课后习题答案 1. 简述软件的发展过程. 2. 简述软件的定义和特点. 定义: 在 IEEE 软件工程词汇标准中,软件的定义是:软件是计算机程序.规 ...

  10. 软件工程 科学出版社 郑逢斌主编 第12章 软件实现 课后习题答案

    软件工程 科学出版社 郑逢斌主编 第12章 软件实现 课后习题答案 1. 简述程序设计语言的基本特征及分类. 程序设计语言,通常简称为编语言,是一组用来定义计算机程序的语法规则.它是一种被标准化的交流 ...

最新文章

  1. 禅道Docker安装包发布
  2. 有监督排序—LDA分析、作图及添加置信-ggord
  3. 让iis支持下载apk,ipa文件
  4. Java的20年:重大事件的时间表
  5. 具有搜索和自定义分页的React Bootstrap表
  6. 牛客小白月赛9 论如何出一道水题
  7. 《剑指offer》第五十八题(左旋转字符串)
  8. DenseNet训练CIFAR10数据集的pytorch实现
  9. 【python】BMR基础代谢率计算器的设计
  10. CVX使用基础教程-结合官网教程翻译
  11. c语言汉诺塔递归算法
  12. LintCode 158. 两个字符串是变位词 JavaScript算法
  13. java策略模式使用场景,Java设计模式—策略模式
  14. QA:filter-CIC滤波器参数设计
  15. linux进程家族树,linux下用c语言创建进程树
  16. 转载:在阿里工作四个月经历的总结
  17. CentOS7系统root分区文件损坏修复的解决方法
  18. 主成分分析和因子分析的主要区别
  19. http——基础知识
  20. 减震透气的清爽跑鞋,让跑步更轻松,咕咚10K悦弹体验

热门文章

  1. python给指定目录所有图片添加水印logo,批量生成替换文件,自适应图片大小添加到图片正中间
  2. 超轻型飞机 - 蟋蟀,世界上最小的双引擎载人飞机!
  3. 盘点国内大数据书籍流派
  4. HTML5期末大作业:动漫网站设计——斗破苍穹动漫(6页)带轮播特效 HTML+CSS+JavaScript 期末作业HTML代码 学生网页课程设计期末作业下载 web网页设计制作成品
  5. 找一个传奇服务端,斗破苍穹斗气化翼版本
  6. font-face使用的web字体格式介绍、浏览器兼容和字体转换
  7. 使用WebClient实现文件下载
  8. 有哪一些测不准原理?
  9. Ubuntu 16.04 LTS安装sogou输入法详解
  10. 〖Python自动化办公篇④〗- 文件自动化管理 - 文件查找与基于文件内容查找文件