第十五章 15 3節練習

2021-06-25 19:01:52 字數 1334 閱讀 7706

練習15.11

為你的quote類體系新增乙個名為debug的虛函式,令其分別顯示是每個類的資料成員。

解答:

void quote::debug()

void bulk_quote::debug()

練習15.12

有必要將乙個成員函式同事宣告成override和final嗎?為什麼?

解答:相應情況下應該是有必要的,雖然我現在也沒有想出是什麼樣的一種情況。

override是為了說明該類的函式對基類函式進行過載。

final是為了不讓派生類對某成員函式進行過載。

如果兩個標示都有,那麼可以說過載止於這個類,這個類的繼承類,就無法對該成員函式繼續過載了。

練習15.13

給定下面的類,解釋每個print函式的機理:

class base

virtual void print(ostream &os)

private:

string basename;

};class derived:public base{

public:

void print(ostream &os){print(os); os << " " 《在上述**中存在問題嗎?如果有,你該如何修改它?

解答:在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 2 1節練習

終於到15章了,物件導向程式設計 之前一直對這種設計方式沒有什麼概念,這裡把概念在這裡再提一下吧。物件導向程式設計 object oriented programming 的核心思想是資料抽象 繼承和動態繫結。通過使用資料抽象,我們可以將類的介面與實現分離 見第七章 使用繼承,可以定義相似的型別並對...

第十五章 15 2 3節練習

練習15.8 給出靜態型別和動態型別的定義。解答 這裡的靜態型別和動態型別是指在繼承關係中的兩種表示式或變數。引用 表示式的靜態型別在編譯時總是已知的,它是變數宣告時的型別或表示式生成的型別 引用 動態型別則是變數或表示式表示的記憶體中的物件的型別。動態型別知道執行時才可知。練習15.9 在什麼情況...

第十五章 15 9 3節練習

練習15.34 針對圖15.3 第565頁 構建的表示式 a 列舉出在處理表示式過程中所有建構函式。b 列舉出cout q所呼叫的rep。c 列舉出q.eval 所呼叫的eval。解答 a query q query fiery query bird query wind 可以將這個表示式進行化簡 ...