容器与继承

Exercise 15.28:

Define a vector to hold Quote objects but put Bulk_quote objects into that vector. Compute the total net_price of all the elements in the vector.

Exercise 15.29:

Repeat your program, but this time store shared_ptrs to objects of type Quote. Explain any discrepancy in the sum generated by the this version and the previous program.

由于前面练习中的vector包含对象,因此不存在多态性在调用虚函数net_price时发生。从本质上讲,对象被推回去的Bulk_quote对象的Quote主题,因此,调用的虚拟net_price函数是Quote::net_price。作为一个结果,没有任何折扣。结果是9090
本练习的对象是指向Quote对象的智能指针。在这个在这种情况下,多态性如期发生。被调用的实际虚函Bulk_quote::net_price确保折扣被应用。因此,结果是6363。可以发现,在价格的计算中采用了30%的折扣。如果没有矛盾,解释为什么没有矛盾。
#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include "quote.h"
#include "bulk_quote.h"
#include "limit_quote.h"
#include "disc_quote.h"
int main()
{/*** @brief ex15.28   outcome == 9090*/std::vector<Quote> v;for(unsigned i = 1; i != 10; ++i)v.push_back(Bulk_quote("sss", i * 10.1, 10, 0.3));double total = 0;for (const auto& b : v){total += b.net_price(20);}std::cout << total << std::endl;std::cout << "======================\n\n";
  /*** @brief ex15.29   outccome == 6363*/std::vector<std::shared_ptr<Quote>> pv;for(unsigned i =1; i != 10; ++i)pv.push_back(std::make_shared<Bulk_quote>(Bulk_quote("sss", i * 10.1, 10, 0.3)));double total_p = 0;for (auto p : pv){total_p +=  p->net_price(20);}std::cout << total_p << std::endl;return 0;
}

basket类

Exercise 15.30: 编写自己的Basket类版本,并使用它计算在前面练习中使用的相同交易的价格。

#ifndef BASKET_H
#define BASKET_H#include "quote.h"
#include <set>
#include <memory>// a basket of objects from Quote hierachy, using smart pointers.
class Basket
{public:// copy verisonvoid add_item(const Quote& sale){ items.insert(std::shared_ptr<Quote>(sale.clone())); }// move versionvoid add_item(Quote&& sale){ items.insert(std::shared_ptr<Quote>(std::move(sale).clone())); }double total_receipt(std::ostream& os) const;private:// function to compare needed by the multiset memberstatic bool compare(const std::shared_ptr<Quote>& lhs,const std::shared_ptr<Quote>& rhs){ return lhs->isbn() < rhs->isbn(); }// hold multiple quotes, ordered by the compare memberstd::multiset<std::shared_ptr<Quote>, decltype(compare)*>items{ compare };
};#endif // BASKET_H
#include "basket.h"
double Basket::total_receipt(std::ostream &os) const
{double sum = 0.0;for(auto iter = items.cbegin(); iter != items.cend();iter = items.upper_bound(*iter))//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^// @note   this increment moves iter to the first element with key//         greater than  *iter.{sum += print_total(os, **iter, items.count(*iter));}                                   // ^^^^^^^^^^^^^ using count to fetch// the number of the same book.os << "Total Sale: " << sum << std::endl;return sum;
}
#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <fstream>
#include "quote.h"
#include "bulk_quote.h"
#include "limit_quote.h"
#include "disc_quote.h"
#include "basket.h"int main()
{Basket basket;for (unsigned i = 0; i != 10; ++i)basket.add_item(Bulk_quote("Bible", 20.6, 20, 0.3));for (unsigned i = 0; i != 10; ++i)basket.add_item(Bulk_quote("C++Primer", 30.9, 5, 0.4));for (unsigned i = 0; i != 10; ++i)basket.add_item(Quote("CLRS", 40.1));std::ofstream log("log.txt", std::ios_base::app|std::ios_base::out);basket.total_receipt(log);return 0;
}

【C++】容器与继承相关推荐

  1. C++ Primer 5th笔记(chap 15 OOP)继承的构造函数容器

    1. 继承的构造函数 1.1 C++11新标准中,派生类可以重用其直接基类定义的构造函数. 继承方式是提供一条注明了直接基类名的using声明语句. class Bulk_quote : public ...

  2. Spring 容器的启动过程

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 本文来源:http://r6f.cn/b47K 一. 前言 ...

  3. Docker镜像、容器数据卷和Dockerfile

    Docker镜像 概述 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. UnionFS ...

  4. Docker系列 五.Docker容器数据卷

    五.Docker容器数据卷 环境&工具: 阿里云轻量级服务器.CentOS 7系统.FinalShell(其他连接客户端也可以) 是什么 docker的理念将运行的环境打包形成容器运行,运行可 ...

  5. 继承ViewGroup研究(汇总) 一、二、三

    转载过来:为一.二.三版本. 仅供参考: 继承ViewGroup研究(1) --简介和一个小Demo 又翻开一个新篇章了,哈哈,上一回学习的是继承View,关于继承View个人感觉不是那么完美,做技术 ...

  6. 历时三年,美图全面容器化踩过的坑

    本文由分享演讲整理而成.通过围绕美图业务和大家分享下美图容器基础平台建设中的探索经验以及在业务落地过程中的具体问题和相应的方案.美图从2016 年开始了容器相关的探索到 2018 年业务基本实现容器化 ...

  7. Docker容器中MySQL最大连接数被限制为214的解决方案

    Docker容器中MySQL最大连接数被限制为214的解决方案 原文:Docker容器中MySQL最大连接数被限制为214的解决方案 一.背景 话说笔者在上次的博客里简单的讲了一下调整MySQL最大连 ...

  8. WPF-常用布局容器

    名称 描述 StackPanel 在水平或垂直的堆栈中放置元素,通常应用于一个复杂的布局中的一小块区域 WrapPanel 在一系列可换行(列)的行中放置元素,支持水平.垂直方向,一行(列)放不下自动 ...

  9. 云原生存储详解:容器存储与 K8s 存储卷

    作者 | 阚俊宝 阿里云技术专家 导读:云原生存储详解系列文章将从云原生存储服务的概念.特点.需求.原理.使用及案例等方面,和大家一起探讨云原生存储技术新的机遇与挑战.本文为该系列文章的第二篇,会对容 ...

最新文章

  1. JAVA线程池ScheduledExecutorService周期性地执行任务 与单个Thread周期性执行任务的异常处理...
  2. 2011年5月19日盘后分析:把握行情运行主线 静待大盘明确信号
  3. 05 state与setState、单向数据流
  4. Linux SSH Publickey登录
  5. dataframe 一列的不同值_python数据分析包|Pandas-02之缺失值(NA)处理
  6. 即将绝版!小米最经典旗舰降价甩,以后不会再有了
  7. java动态创建bean的意义_Spring Boot如何动态创建Bean示例代码
  8. Guava库学习:学习Concurrency(二)Monitor_2
  9. 纽微特记事:刚内斗胜利,就说业务难做
  10. 基于springboot社区疫情防控管理系统
  11. 微型计算机控制技术小论文,微型计算机控制技术结课论文..doc
  12. 沉没的王国---揭秘滇东自杞国(1)
  13. excel多工作表汇总如何完成?
  14. Qt 报错1:cannot find -lGL
  15. linux列表去重复数据,Linux常用去除重复数据口令
  16. html5适配屏幕,HTML5屏幕适配标签设置
  17. FastqC结果简介
  18. IDEMIA携手Unisys为澳大利亚内政事务部提供生物识别服务
  19. 【Lintcode】962. Condition String
  20. 各地图坐标转换工具类

热门文章

  1. c 与java 反射性能_谈谈Java 反射的快慢
  2. mysql err 1349_MySQL 视图 第1349号错误解决方法
  3. dockefile nginx php,dockerfile自动部署nginx+php7
  4. c语言想调用函数怎么弄43,如果想要调用这个函数,还应该怎么写
  5. html5的在线播放页面,整理5款html5网页播放器,总有一款适合你吧
  6. 自定义apt升级脚本
  7. MPlayer编译步骤
  8. 三维点云语义分割总览
  9. 高亮提示、聚焦控件并滚动到浏览器中干好可以查看到该控件的位置
  10. 在macOS 10.13.6上安装go 1.13.8实录