練習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 可以將這個表示式進行化簡 ...