Skip to content

Commit

Permalink
ch15 ex15.22 ready
Browse files Browse the repository at this point in the history
  • Loading branch information
huangmingchuan committed Jan 18, 2016
1 parent d0d9692 commit 1d22bb4
Showing 1 changed file with 132 additions and 1 deletion.
133 changes: 132 additions & 1 deletion ch15/README.md
Original file line number Diff line number Diff line change
@@ -1 +1,132 @@
## 练习15.1
## 练习15.1

> 什么是虚成员?
## 练习15.2

> protected 访问说明符与 private 有何区别?
## 练习15.3

> 定义你自己的 Quote 类和 print_total 函数。
## 练习15.4

> 下面哪条声明语句是不正确的?请解释原因。
```cpp
class Base { ... };
(a) class Derived : public Derived { ... };
(b) class Derived : private Base { ... };
(c) class Derived : public Base;
```

## 练习15.5

> 定义你自己的 Bulk_quote 类。
## 练习15.6

> 将 Quote 和 Bulk_quote 的对象传给15.2.1节练习中的 print_total 函数,检查该函数是否正确。
## 练习15.7

> 定义一个类使其实现一种数量受限的折扣策略,具体策略是:当购买书籍的数量不超过一个给定的限量时享受折扣,如果购买量一旦超过了限量,则超出的部分将以原价销售。
## 练习15.8

> 给出静态类型和动态类型的定义。
## 练习15.9

> 在什么情况下表达式的静态类型可能与动态类型不同?请给出三个静态类型与动态类型不同的例子。
## 练习15.10

> 回忆我们在8.1节进行的讨论,解释第284页中将 ifstream 传递给 Sales_data 的read 函数的程序是如何工作的。
## 练习15.11

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

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

> 给定下面的类,解释每个 print 函数的机理:
```cpp
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;
};
```
在上述代码中存在问题吗?如果有,你该如何修改它?
## 练习15.14
> 给定上一题中的类以及下面这些对象,说明在运行时调用哪个函数:
```cpp
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();
```

## 练习15.15

> 定义你自己的 Disc_quote 和 Bulk_quote。

## 练习15.16

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

## 练习15.17

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

## 练习15.18

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

## 练习15.19

> 假设543页和544页的每个类都有如下形式的成员函数:
```cpp
void memfcn(Base &b) { b = *this; }
```
对于每个类,分别判断上面的函数是否合法。
## 练习15.20
> 编写代码检验你对前面两题的回答是否正确。
## 练习15.21
> 从下面这些一般性抽象概念中任选一个(或者选一个你自己的),将其对应的一组类型组织成一个继承体系:
```cpp
(a) 图形文件格式(如gif、tiff、jpeg、bmp)
(b) 图形基元(如方格、圆、球、圆锥)
(c) C++语言中的类型(如类、函数、成员函数)
```

## 练习15.22

> 对于你在上一题中选择的类,为其添加函数的虚函数及公有成员和受保护的成员。

0 comments on commit 1d22bb4

Please sign in to comment.