第十五章 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()

0 0
原创粉丝点击