forked from huangmingchuan/Cpp_Primer_Answers
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
d0d9692
commit 1d22bb4
Showing
1 changed file
with
132 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
|
||
> 对于你在上一题中选择的类,为其添加函数的虚函数及公有成员和受保护的成员。 |