文章目录
- 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 Book (1){private: double price;public:Book (double price) { //访问本元素(2);}void accept(Visitor visitor) {(3);}double getPrice() {return price; }
};
class Cashier(4){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 Book (1){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 Book (1){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 Cashier(4){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*>