C++ Primer第五版_第十五章习题答案(11~20)

2023-05-16

文章目录

      • 练习15.11
      • 练习15.12
      • 练习15.13
      • 练习15.14
      • 练习15.15
        • Disc_quote.h
        • Bulk_quote.h
      • 练习15.16
      • 练习15.17
      • 练习15.18
      • 练习15.19
      • 练习15.20

练习15.11

为你的 Quote 类体系添加一个名为 debug 的虚函数,令其分别显示每个类的数据成员。

void Quote::debug() const
{
    std::cout << "data members of this class:\n"
              << "bookNo= " <<this->bookNo << " "
              << "price= " <<this->price<< " ";
}

练习15.12

有必要将一个成员函数同时声明成 override 和 final 吗?为什么?

有必要。override 的含义是重写基类中相同名称的虚函数,final 是阻止它的派生类重写当前虚函数。

练习15.13

给定下面的类,解释每个 print 函数的机理:

class base {
public:
	string name() { return basename;}
	virtual void print(ostream &os) { os << basename; }
private:
	string basename;
};
class derived : public base {
public:
	void print(ostream &os) { print(os); os << " " << i; }
private:
	int i;
};

在上述代码中存在问题吗?如果有,你该如何修改它?

有问题。应该改为:

void print(ostream &os) override { base::print(os); os << " derived\n " << i; }

练习15.14

给定上一题中的类以及下面这些对象,说明在运行时调用哪个函数:

base bobj; 		base *bp1 = &bobj; 	base &br1 = bobj;
derived dobj; 	base *bp2 = &dobj; 	base &br2 = dobj;
(a) bobj.print();	(b)dobj.print();	(c)bp1->name();
(d)bp2->name();		(e)br1.print();		(f)br2.print();
  • (a) 编译时。
  • (b) 编译时。
  • © 编译时。
  • (d) 编译时。
  • (e) 运行时。base::print()
  • (f) 运行时。derived::print()

练习15.15

定义你自己的 Disc_quote 和 Bulk_quote。

Disc_quote.h

#ifndef DISC_QUOTE_H
#define DISC_QUOTE_H

#include "exercise15_5.h"

class Disc_quote : public Quote
{
public:
	Disc_quote();
	Disc_quote(const std::string& b, double p, std::size_t q, double d) :
		Quote(b, p), quantity(q), discount(d)
	{}

	virtual double net_price(std::size_t n) const override = 0;

protected:
	std::size_t quantity;
	double      discount;
};

#endif // DISC_QUOTE_H

Bulk_quote.h

#ifndef BULK_QUOTE_H_
#define BULK_QUOTE_H_
#include "Disc_quote.h"

class Bulk_quote : public Disc_quote
{
public:
	Bulk_quote() = default;
	Bulk_quote(const std::string& b, double p, std::size_t q, double disc) :
		Disc_quote(b, p, q, disc)
	{}

	double net_price(std::size_t n) const override;
};

#endif // BULK_QUOTE_H

练习15.16

改写你在15.2.2节练习中编写的数量受限的折扣策略,令其继承 Disc_quote。

#ifndef LIMIT_QUOTE_H
#define LIMIT_QUOTE_H

#include "disc_quote.h"

class Limit_quote : public Disc_quote
{
public:
	Limit_quote() = default;
	Limit_quote(const std::string& b, double p, std::size_t max, double disc) :
		Disc_quote(b, p, max, disc)
	{}

	double net_price(std::size_t n) const override
	{
		return n * price * (n < quantity ? 1 - discount : 1);
	}

};

#endif // LIMIT_QUOTE_H

练习15.17

尝试定义一个 Disc_quote 的对象,看看编译器给出的错误信息是什么?

error: cannot declare variable ‘d’ to be of abstract type ‘Disc_quote’: Disc_quote d;

练习15.18

假设给定了第543页和第544页的类,同时已知每个对象的类型如注释所示,判断下面的哪些赋值语句是合法的。解释那些不合法的语句为什么不被允许。

Base *p = &d1;  //d1 的类型是 Pub_Derv
p = &d2;		//d2 的类型是 Priv_Derv
p = &d3;		//d3 的类型是 Prot_Derv
p = &dd1;		//dd1 的类型是 Derived_from_Public	
p = &dd2;		//dd2 的类型是 Derived_from_Private
p = &dd3;		//dd3 的类型是 Derived_from_Protected
  • Base *p = &d1; 合法
  • p = &d2; 不合法
  • p = &d3; 不合法
  • p = &dd1; 合法
  • p = &dd2; 不合法
  • p = &dd3; 不合法

练习15.19

假设543页和544页的每个类都有如下形式的成员函数:

void memfcn(Base &b) { b = *this; }

对于每个类,分别判断上面的函数是否合法。

合法:

  • Pub_Derv
  • Priv_Derv
  • Prot_Derv
  • Derived_from_Public
  • Derived_from_Protected 不合法:
  • Derived_from_Private

练习15.20

编写代码检验你对前面两题的回答是否正确。

#include <iostream>
#include <string>

#include "exercise15_5.h"
#include "bulk_quote.h"
#include "limit_quote.h"
#include "disc_quote.h"

class Base
{
public:
	void pub_mem();   // public member
protected:
	int prot_mem;     // protected member
private:
	char priv_mem;    // private member
};

struct Pub_Derv : public    Base
{
	void memfcn(Base &b) { b = *this; }
};
struct Priv_Derv : private   Base
{
	void memfcn(Base &b) { b = *this; }
};
struct Prot_Derv : protected Base
{
	void memfcn(Base &b) { b = *this; }
};

struct Derived_from_Public : public Pub_Derv
{
	void memfcn(Base &b) { b = *this; }
};
struct Derived_from_Private : public Priv_Derv
{
	//void memfcn(Base &b) { b = *this; }
};
struct Derived_from_Protected : public Prot_Derv
{
	void memfcn(Base &b) { b = *this; }
};

int main()
{
	Pub_Derv d1;
	Base *p = &d1;

	Priv_Derv d2;
	//p = &d2;

	Prot_Derv d3;
	//p = &d3;

	Derived_from_Public dd1;
	p = &dd1;

	Derived_from_Private dd2;
	//p =& dd2;

	Derived_from_Protected dd3;
	//p = &dd3;


	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ Primer第五版_第十五章习题答案(11~20) 的相关文章

  • C语言中字符串的结束标志是什么

    C语言中字符串的结束标志是 39 0 39 C语言中没有专门的字符串变量 xff0c 通常用一个字符数组来存放一个字符串 xff0c 字符串总是以 39 0 39 作为结束符 39 0 39 就是8位的00000000 xff0c 因为字符
  • Linux驱动开发(十八)---网络(网卡)驱动学习

    前文回顾 Linux驱动开发 xff08 一 xff09 环境搭建与hello world Linux驱动开发 xff08 二 xff09 驱动与设备的分离设计 Linux驱动开发 xff08 三 xff09 设备树 Linux驱动开发 x
  • c语言源文件经过编译后生成文件的后缀是什么?

    c语言源文件经过编译后 xff0c 生成文件的后缀是 obj C语言源文件后缀名是 c xff0c 编译生成的文件后缀名是 obj xff0c 连接后可执行文件的后缀名是 exe C语言创建程序的步骤 xff1a 编辑 xff1a 就是创建
  • C语言strcmp函数用法

    C语言strcmp函数用法 strcmp函数语法为 int strcmp char str1 char str2 xff0c 其作用是比较字符串str1和str2是否相同 xff0c 如果相同则返回0 xff0c 如果不同 xff0c 前者
  • C++ 空指针和野指针

    点击蓝字 关注我们 来源于网络 xff0c 侵删 1 空指针 指针变量指向内存中编号为0的空间为空指针 空指针指向的内存空间是不可以访问的 代码 xff1a include lt iostream gt using namespace st
  • 如何用C++实现动态放烟花(附源码)

    点击蓝字 关注我们 来源于网络 xff0c 侵删 一 前言 C 43 43 实现的放烟花程序 用到了EGE图形库 xff0c 没有的需要自行安装 可调项 xff1a 背景图和背景音乐 粒子模糊度 亮度以及上升速度的参数 实现的动态烟花非常好
  • C语言内存泄漏问题及其检视方法

    点击蓝字 关注我们 来源于网络 xff0c 侵删 通过介绍内存泄漏问题原理及检视方法 xff0c 希望后续能够从编码检视环节就杜绝内存泄漏导致的网上问题发生 本文通过介绍内存泄漏问题原理及检视方法 xff0c 希望后续能够从编码检视环节就杜
  • C语言进阶之 回调函数详解

    点击蓝字 关注我们 因公众号更改推送规则 xff0c 请点 在看 并加 星标 第一时间获取精彩技术分享 来源于网络 xff0c 侵删 在讲回调函数之前 xff0c 我们需要了解函数指针 我们都知道 xff0c C语言的灵魂是指针 xff0c
  • C语言和C++的区别和联系,大多数人都说错了

    点击蓝字 关注我们 因公众号更改推送规则 xff0c 请点 在看 并加 星标 第一时间获取精彩技术分享 来源于网络 xff0c 侵删 C语言和C 43 43 到底是什么关系 xff1f 首先C 43 43 和C语言本来就是两种不同的编程语言
  • 深入理解C语言中的malloc,malloc() 与 free() 原理图解

    点击蓝字 关注我们 因公众号更改推送规则 xff0c 请点 在看 并加 星标 第一时间获取精彩技术分享 来源于网络 xff0c 侵删 本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程 本文不过度关注细节 xff0c 因此只是
  • C语言项目:灰度处理技术

    Hello xff0c 今天给大家带来的是一个比较简单的图形处理技术 灰度处理技术 那么到底什么是灰度处理技术呢 xff1f 简单来说 xff0c 所谓的灰度处理技术就是把一张彩色的图片变成一张灰色的图片 如下图所示 xff0c 左边是原图
  • React Native重启APP

    有时会用到APP重启操作 xff0c 比如更新代码或者特殊情况的用户注销 0 62及以上版本 只重启JS部分 import DevSettings from 39 react native 39 DevSettings reload 详细请
  • 树莓派3 Ubuntu系统 SD卡或U盘启动

    之前先用SD卡装过Ubuntu系统后 xff0c 用着用着SD卡满了 xff0c 就拿了个U盘来重装一遍 xff0c 发现U盘按照SD卡那样的流程安装之后 xff0c 树莓派配置成可以U盘启动 xff0c 再修改刻录好的U盘里的两个文件就可
  • 手把手教你安装黑苹果之openCore-0.6.3 EFI制作全过程,非常详细

    文章目录 前言一 EFI是什么 xff1f 二 获取EFI1 Hackintosh黑苹果长期维护机型整理清单2 搜索efi 二 自制EFI1 OC Gen X图形化一键自动生成EFI 推荐 2 手动下载EFI所需要的文件下载哪些文件下载op
  • OpenCore 启动菜单界面美化增加gui界面

    前言 OpenCore 默认启动界面是类似于命令行一样的黑乎乎的界面 习惯了clover华丽的启动界面的小伙伴可能不适应了 甚至我之前以为OpenCore启动界面就是这样的不能变呢 xff1f 第一次看到感觉还是clover讨喜 其实Ope
  • secoclient全版本下载分享

    前言 工作需要使用 secoclient xff0c 同事们大多都用 Windows环境 客户提供的客户端也是Windows版本的 这就让使用Mac几个同事难受啦 用Windows虚拟机 xff1f 根据我的经验 xff0c 一般的VPN客
  • Centos升级ruby

    CentOS7 安装的ruby默认版本是 xff1a ruby v span class token punctuation span 11 43 53 span class token punctuation span ruby 2 0
  • Windows 11下载

    Windows 11是微软于2021年推出的Windows NT系列操作系统 xff0c 为Windows 10的后继者 正式版本于2021年10月5日发行 xff0c 并开放给符合条件的Windows 10设备通过Windows Upda
  • docker容器安装图形桌面

    文章目录 视频教程版本信息创建一个CONTAINERubuntu官方国内源docker镜像unminimize中文环境设置中文环境 安装安装TigerVNC Server安装 xfce4精简版本 配置设置vnc密码 vnc xstartup
  • ubuntu官方国内源

    背景 之前我一直在使用中科大的源 xff0c 还是挺快的 一直也没有感觉有什么问题 直到最近在折腾vnc xff0c 发现中科大的源有一些包会404 xff0c 安装不了 而我在vmware中的正好是默认的cn archive ubuntu

随机推荐

  • mame新版ROM下载网站推荐

    网站地址 https www retroroms info index php 中文插件安装 浏览器插件 https www tampermonkey net UP主自己写的脚本 已经失效 https gitee com lxyoucan
  • RuoYi若依打包发布与部署

    上一节我们已经讲过了如果搭建开发环境 xff0c 那么如果代码写完了 xff0c 如何打包发布 部署到生产环境呢 xff1f RuoYi开发实战 搭建开发环境 https blog csdn net lxyoucan article det
  • vscode设置Prettier为默认格式化插件

    1 目的 xff1a ctrl 43 s保存 xff0c 自动格式化文档 2 所需插件Prettier 3 操作步骤 先打开vscode软件 xff0c 左下角点击设置 gt 打开设置 gt 在右上方有一个搜索框 先设定自动保存文件 xff
  • ASUS X415安装系统找不到硬盘解决办法

    同事让我帮忙安装系统 xff0c 笔记本电脑型号是ASUS X415 原本以为是手到擒来的事情 xff0c 结果我在上面还是消耗了不少时间 现象 老毛桃PE 无法识别到硬盘 微PE可以识别到硬盘 xff0c 但是系统安装以后 xff0c 无
  • archlinux中navicat无法使用fcitx5输入法

    现象 archlinux中navicat无法使用fcitx5输入法 而我在ubuntu中使用navicat调用fcitx输入法是可以正常使用的 在网上搜索了很久 xff0c 这方面的文章比较少 而我的其他程序输入法又是正常的 解决办法 参考
  • JetBrains Gateway IDEA远程开发

    为什么进行远程开发 xff1f 无论身处何处数秒内连接至远程环境 充分利用远程计算机的强大功能 在任何笔记本电脑上都可以轻松工作 xff0c 无论其性能如何 借助远程计算机的计算资源 xff0c 充分利用最大规模的数据集和代码库 在远程服务
  • ubuntu 22.04安装nvm

    执行安装脚本 span class token function sudo span span class token function apt span span class token function install span spa
  • 手推DNN,CNN池化层,卷积层反向传播

    反向传播算法是神经网络中用来学习的算法 xff0c 从网络的输出一直往输出方向计算梯度来更新网络参数 xff0c 达到学习的目的 xff0c 而因为其传播方向与网络的推理方向相反 xff0c 因此成为反向传播 神经网络有很多种 xff0c
  • 软件架构概念和面向服务的架构

    摘要 软件架构作为软件开发过程的一个重要组成部分 xff0c 有着各种各样的方法和路线图 xff0c 它们都有一些共同的原则 基于架构的方法作为控制系统构建和演化复杂性的一种手段得到了推广 引言 在计算机历史中 xff0c 软件变得越来越复
  • 初识强化学习,什么是强化学习?

    相信很多人都听过 机器学习 和 深度学习 但是听过 强化学习 的人可能没有那么多 那么 什么是强化学习呢 强化学习是机器学习的一个子领域 它可以随着时间的推移自动学习到最优的策略 在我们不断变化的纷繁复杂的世界里 从更广的角度来看 即使是单
  • 强化学习形式与关系

    在强化学习中有这么几个术语 智能体 Agent 环境 Environment 动作 Action 奖励 Reward 状态 State 有些地方称作观察 Observation 奖励 Reward 在强化学习中 奖励是一个标量 它是从环境中
  • 多层网络和反向传播笔记

    在我之前的博客中讲到了感知器 xff08 感知器 xff09 xff0c 它是用于线性可分模式分类的最简单的神经网络模型 xff0c 单个感知器只能表示线性的决策面 xff0c 而反向传播算法所学习的多层网络能够表示种类繁多的非线性曲面 对
  • 在Kaggle手写数字数据集上使用Spark MLlib的朴素贝叶斯模型进行手写数字识别

    昨天我在Kaggle上下载了一份用于手写数字识别的数据集 xff0c 想通过最近学习到的一些方法来训练一个模型进行手写数字识别 这些数据集是从28 28像素大小的手写数字灰度图像中得来 xff0c 其中训练数据第一个元素是具体的手写数字 x
  • Ros使用自定义数据通讯无法收到消息的分析和解决

    nbsp 在实际的开发中 和别的模块定义了自定义的 数据类型 比如 userMsg msg文件 Header header int32 nState string strImageName string strYamlName 报错和原因
  • 在Kaggle手写数字数据集上使用Spark MLlib的RandomForest进行手写数字识别

    昨天我使用Spark MLlib的朴素贝叶斯进行手写数字识别 xff0c 准确率在0 83左右 xff0c 今天使用了RandomForest来训练模型 xff0c 并进行了参数调优 首先来说说RandomForest 训练分类器时使用到的
  • 遇见AI,从Java到数据挖掘。

    在上小学的时候就听说过AI xff0c 人工智能 xff0c 那个时候我对人工智能的感受都来自于各类影视作品 xff0c 类人的外表 xff0c 能听说读写 xff0c 有情感 xff0c 会思考 所以那个时候的我将人工智能想象成和人类相似
  • PyTorch模型保存与加载

    torch save xff1a 保存序列化的对象到磁盘 xff0c 使用了Python的pickle进行序列化 xff0c 模型 张量 所有对象的字典 torch load xff1a 使用了pickle的unpacking将pickle
  • ROS和ROS2.0到底该用哪个呢?

    很多朋友经常问ROS1 0 下文简称ROS 和ROS2 0我到底该学习 使用哪个呢 欢迎拍砖讨论 但若是因此对您的项目或产品造成了损失 本人不负任何责任 我先给出个人的观点 再说明其中原因 对于大众学习者 普通开发者 机器人算法开发者 在2
  • C++ Primer第五版_第一章习题答案

    文章目录 题目概览1 1 编译器文档1 2 错误标识1 3 Hello World1 4 两数相乘1 5 独立语句1 6 程序合法性1 7 不正确的嵌套注释1 8 语句合法性1 9 50到100的整数相加1 10 递减顺序打印10到0之间的
  • C++ Primer第五版_第十五章习题答案(11~20)

    文章目录 练习15 11练习15 12练习15 13练习15 14练习15 15Disc quote hBulk quote h 练习15 16练习15 17练习15 18练习15 19练习15 20 练习15 11 为你的 Quote 类