【C++ 系列文章 -- 程序员考试 下午场 C++ 专题 201711 】

news/2024/11/17 23:53:13/

文章目录

    • 1.1 C++ 题目六
      • 1.1.1 填空(1)详解
      • 1.1.2 填空(2)详解
        • 1.1.2.1 C++ this 的使用
      • 1.1.3 填空(3)详解
      • 1.1.4 填空(4)详解
      • 1.1.5 填空(5)详解
      • 1.1.6 填空(6)详解

1.1 C++ 题目六

试题六(共15分)
阅读下列说明和C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。

【说明 】
以下C++代码实现一个超市简单销售系统中的部分功能,顾客选择图书等物品(Item)加入购物车(ShoppingCart),到收银台(Cashier)对每个购物车中的物品统计其价格进行结账,设计如图6-1所示类图。
在这里插入图片描述

using namespace std;
class Book;
class Visitor {public:virtual void visit(Book book)=0;//其它物品的visit方法
};class Item {public:virtual void accept(Visitor visitor)=0;virtual double getPrice()=0;
};class Book1{private:    double price;public:Book (double price) { //访问本元素2;}void accept(Visitor visitor) {3;}double getPrice() {return price;        }
};
class Cashier4{private;double totalForCart;public://访问Book类型对象的价格并累加5{//假设Book类型的物品价格超过10元打8折if(book->getPrice()<10.0) {totalForCart+=book->getPrice();} elsetotalForCart+=book->getPrice()0.8;}//其它visit方法和折扣策略类似,此处略double getTotal() {return totalForCart;}
};class ShoppingCart {private:vector<Item>items;public:double calculatePrice() {Cashier visitor=new Cashier();for(int i=0;i <items.size();i++)</item>6;}double total=visitor->getTotal();return total;}void add(Iteme) {items.push_back(e);}
};</items.size();i++)></item*>

1.1.1 填空(1)详解

从下面的代码可以看出 类Book 是继承了父类Item,因为子类Book对父类中的两个虚函数都做了重载。

class Item {public:virtual void accept(Visitor visitor)=0;virtual double getPrice()=0;
};class Book1{private:    double price;public:Book (double price) { //访问本元素2;}void accept(Visitor visitor) {3;}double getPrice() {return price;        }
};

所以空格(1) 应该填:public Item, 那么为什么要采用public 继承呢?因为:

  • 经过 public 继承,基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:public, protected, private;
  • 经过 protected 继承,基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:protected, protected, private;
  • 经过 private 继承,基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:private, private, private

1.1.2 填空(2)详解

可以看到填空(2) 是子类 Book 构建函数的实现,这个时候可以看到“注释” : “访问本元素”,子类 Book 中有个成员变量 price,所以可以猜出来是给成员变量price赋值,所以空格(2)应该填this->price=price

1.1.2.1 C++ this 的使用

在 C++ 中,this 指针是一个特殊的指针,它指向当前对象的实例。在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。通过使用 this 指针,我们可以在成员函数中访问当前对象的成员变量,即使它们与函数参数或局部变量同名,这样可以避免命名冲突,并确保我们访问的是正确的变量。

1.1.3 填空(3)详解

填空(3) 是 子类Book 中成员函数 void accept(Visitor visitor)的具体实现,它的参数是基类Visitor, 但是这个基类在整个code中并没有使用到,而且 基类Visitor中的纯虚函数virtual void visit(Book book)=0参数类型为Book填空(3)所以填visitor->visit(this),因为this即指向Book 类型对象。且 C++ 的潜规则是类中的纯需函数一定要在子类中重载!!!

class Visitor {public:virtual void visit(Book book)=0;//其它物品的visit方法
};class Item {public:virtual void accept(Visitor visitor)=0;virtual double getPrice()=0;
};class Book1{private:    double price;public:Book (double price) { //访问本元素2;}void accept(Visitor visitor) {3;}double getPrice() {return price;        }
};

1.1.4 填空(4)详解

由上节内容我们知道纯虚函数必须要在子类中重载,在整个code中没有找到 基类class Visitor的子类,所以猜测class Cashier 继承了 基类class Visitor, 也只有它可以继承了。所以空格(4)填写:public Visitor

class Cashier4{private;double totalForCart;public://访问Book类型对象的价格并累加5{//假设Book类型的物品价格超过10元打8折if(book->getPrice()<10.0) {totalForCart+=book->getPrice();} elsetotalForCart+=book->getPrice()0.8;}//其它visit方法和折扣策略类似,此处略double getTotal() {return totalForCart;}
};

1.1.5 填空(5)详解

由于 纯虚函数必须要在子类中重载,所以 空格 (5) 应该填写void visit(Book*book)

1.1.6 填空(6)详解

从代码中可以看到空格(6)应该是个累加过程,所以应该填一个和价格计算相关的内容,我们知道价格的计算是在类Cashier的成员函数void visit(Book*book) 中实现的。Item 是 Book的父类,Book中实现了 Itme中的方法。所以向量items中的累加要调用的Book中的函数,Book中的函数只有accept 和 Visitor有关,所以空格(6)应该填items[i]->accept(visitor)

class ShoppingCart {private:vector<Item>items;public:double calculatePrice() {Cashier visitor=new Cashier();for(int i=0;i <items.size();i++)</item>6;}double total=visitor->getTotal();return total;}void add(Iteme) {items.push_back(e);}
};</items.size();i++)></item*>

http://www.ppmy.cn/news/1188882.html

相关文章

精密数据工匠:探索 Netty ChannelHandler 的奥秘

通过上篇文章&#xff08;Netty入门 — Channel&#xff0c;把握 Netty 通信的命门&#xff09;&#xff0c;我们知道 Channel 是传输数据的通道&#xff0c;但是有了数据&#xff0c;也有数据通道&#xff0c;没有数据加工也是没有意义的&#xff0c;所以今天学习 Netty 的第四…

《微聊》JMeter性能测试报告

文章目录 准备工作JMeter准备工作本地配置代理 测试规划测试方向预期方向异常处理 压力测试录制注册功能压力注册功能压力脚本录制录制功能压力测试脚本完善注册功能压力测试结果 登录功能压力录制登录功能压力测试脚本构造压力测试数据完善登录功能性能测试脚本登录功能压力测…

apt-get-update报错

apt-get-update报错 错误一 E: Malformed entry 1 in list file /etc/apt/sources.list.d/pgdg.list (Component) E: The list of sources could not be read.查看原因&#xff1a; sudoedit /etc/apt/sources.list.d/pgdg.list可以看到显示的链接deb http://apt.postgresql…

【开题报告】基于SpringBoot的研究生管理系统的设计与开发

1.研究背景 研究生教育是高等教育体系中的重要组成部分&#xff0c;对于培养高层次、高水平的专业人才和推动科学研究具有重要意义。研究生管理是保证研究生培养质量和提升研究生培养工作效率的关键环节。然而&#xff0c;传统的研究生管理方式存在一些问题&#xff0c;如信息…

CondaError_ Downloaded bytes did not match Content-Length

问题 使用anaconda下载包文件时&#xff0c;出现了CondaError: Downloaded bytes did not match Content-Length的错误 CondaError: Downloaded bytes did not match Content-Lengthurl: https://conda.anaconda.org/pytorch/win-64/pytorch-2.1.0-py3.11_cuda11.8_cudnn8_0.…

J2EE项目部署与发布(Linux版本)

目录 一.jdk&tomcat安装 1.jdk的安装 1.2解压对应的安装包 1.3配置环境变量 2.tomcat的安装 二.mysql的安装 三.后端接口部署 后端部署 导入war包 修改端口 开启访问 一.jdk&tomcat安装 1.jdk的安装 登录VMware Workstation Pro 然后连接MobaXterm 将 jd…

tomcat安装及配置教程

tomcat安装及配置教程 Tomcat的安装及配置步骤如下&#xff1a; 一、下载Tomcat 下载地址&#xff08;Tomcat官网&#xff09;&#xff1a;Apache Tomcat - Welcome!。自行选择版本下载&#xff0c;并将文件安装或者解压到D或E盘且目录中不要有中文。 二、检查JDK是否安装 …

【原创】java+swing+mysql无偿献血管理系统设计与实现

摘要&#xff1a; 无偿献血管理系统是为了实现无偿献血规范化、有序化、高效化的管理而设计的。本文主要介绍使用java语言开发一个基于C/S架构的无偿献血管理系统&#xff0c;提高无偿献血管理的工作效率。 功能分析&#xff1a; 系统主要提供给管理员、无偿献血人员&#x…