第十五章 15.3节练习
来源:互联网 发布:王宝强人品知乎 编辑:程序博客网 时间:2024/05/18 01:51
练习15.11
为你的Quote类体系添加一个名为debug的虚函数,令其分别显示是每个类的数据成员。
解答:
void Quote::debug(){ std::cout << "bookNo : " << bookNo << std::endl; std::cout << "price : " << price << std::endl;}
void Bulk_quote::debug(){ std::cout << "min_qty : " << min_qty << std::endl; std::cout << "discount : " << discount << std::endl;}
练习15.12
有必要将一个成员函数同事声明成override和final吗?为什么?
解答:
相应情况下应该是有必要的,虽然我现在也没有想出是什么样的一种情况。
override是为了说明该类的函数对基类函数进行重载。
final是为了不让派生类对某成员函数进行重载。
如果两个标示都有,那么可以说重载止于这个类,这个类的继承类,就无法对该成员函数继续重载了。
练习15.13
给定下面的类,解释每个print函数的机理:
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;};
在上述代码中存在问题吗?如果有,你该如何修改它?
解答:
在539页有一个warning需要注意一下
【引用】如果一个派生类虚函数需要调用它的基类版本,但是没有使用作用域运算符,则在运行时该调用将被解析为对派生类版本自身的调用,从而导致无限递归。
这里在derived类中,调用print()函数,就产生了这种无限递归。
练习15.14
给定上一题中的类以及下面这些对象,说明再运行时调用哪个函数:
base bobj;
derived dobj;
base *bp1 = &bobj;
base *bp2 = &dobj;
base &br1 = bobj;
base &br2 = dobj;
(a) bobj.print();
(b) dobj.print();
(c) bp1->name();
(d) bp2 ->name();
(e) br1.print();
(f) br2.print();
解答:
这里要想这些print()函数能编译通过,需要给print()函数添加默认实参。
(a) base中的print()
(b) derived中的print()
(c) base中的name()
(d) base中的name()
(e) base中的print()
(f) derived中的print()
- 第十五章 15.3节练习
- 第十五章 15.4节练习
- 第十五章 15.5节练习
- 第十五章 15.2.1节练习
- 第十五章 15.2.2节练习
- 第十五章 15.2.3节练习
- 第十五章 15.9.2节练习
- 第十五章 15.9.3节练习
- 第十五章 15.9.4节练习
- 第十五章 编程练习
- 第十五章 15.6节练习 & 15.7.1节练习
- 第十五章 15.7.2节练习 & 15.7.3节练习
- 第十五章 15.7.4节练习 & 15.8节练习
- 第十五章 15.8.1节练习 & 15.9.1节练习
- simply scheme 第十五章 练习
- 第十五章编程练习(1)
- 第十五章上机练习2
- 第十五章上机练习3
- PHP调试环境
- yii框架的部署方法
- SGU 481 Hero of Our Time java大数+规律
- 真机测试
- linux 下route命令
- 第十五章 15.3节练习
- HDU 3779 Railroad
- Liferay Portal 连接配置MySQL数据库 (三)
- ios项目icon和default图片命名规则
- SGU 482 Impudent Thief dp
- UITableViewCell的简介与重构,以及代码
- JAVA 封装, 继承, 多态
- git安装
- 零基础带你3步快速掌握iSCSI搭建