15.1 什么是虚成员?
答:
对于某些函数,基类希望它的派生类各自定义适合自身的版本,此时基类就将这些函数声明成虚函数。
15.2 protected
访问说明符与 private
有何区别?
答:
protected
: 基类和和其派生类还有友元可以访问。private
: 只有基类本身和友元可以访问。
15.3 定义你自己的 Quote
类和 print_total
函数。
答:
15.4 下面哪条声明语句是不正确的?请解释原因。
答:
- (a) 不正确。类不能派生自身。
- (b) 不正确。这是定义而非声明。
- (c) 不正确。派生列表不能出现在这。
15.6 将 Quote
和 Bulk_quote
的对象传给15.2.1节练习中的 print_total
函数,检查该函数是否正确。
答:
15.7 定义一个类使其实现一种数量受限的折扣策略,具体策略是:当购买书籍的数量不超过一个给定的限量时享受折扣,如果购买量一旦超过了限量,则超出的部分将以原价销售。
答:
15.8 给出静态类型和动态类型的定义。
答:
表达式的静态类型在编译时总是已知的,它是变量声明时的类型或表达式生成的类型。动态类型则是变量或表达式表示的内存中的对象的类型。动态类型直到运行时才可知。
15.9 在什么情况下表达式的静态类型可能与动态类型不同?请给出三个静态类型与动态类型不同的例子。
答:
基类的指针或引用的静态类型可能与其动态类型不一致。
15.11 为你的 Quote
类体系添加一个名为 debug
的虚函数,令其分别显示每个类的数据成员。
答:
15.12 有必要将一个成员函数同时声明成 override
和 final
吗?为什么?
答:
有必要。override
的含义是重写基类中相同名称的虚函数,final
是阻止它的派生类重写当前虚函数。
15.13 给定下面的类,解释每个 print
函数的机理:
在上述代码中存在问题吗?如果有,你该如何修改它?
答:
有问题,应改为
15.14 给定上一题中的类以及下面这些对象,说明在运行时调用哪个函数:
答:
- (a) 编译时。
- (b) 编译时。
- (c) 编译时。
- (d) 编译时。
- (e) 运行时。
base::print()
- (f) 运行时。
derived::print()
15.15
定义你自己的 Disc_quote
和 Bulk_quote
。
答:
15.18 假设给定了第543页和第544页的类,同时已知每个对象的类型如注释所示,判断下面的哪些赋值语句是合法的。解释那些不合法的语句为什么不被允许:
答:
Base *p = &d1; 合法 p = &d2; 不合法 p = &d3; 不合法 p = &dd1; 合法 p = &dd2; 不合法 p = &dd3; 不合法
这章的题好没意思,其余略了。