練習15.34
針對圖15.3(第565頁)構建的表示式:
(a) 列舉出在處理表示式過程中所有建構函式。
(b) 列舉出cout << q所呼叫的rep。
(c) 列舉出q.eval()所呼叫的eval。
解答:(a) query q = query("fiery") & query("bird") | query("wind");
可以將這個表示式進行化簡:
query fiery = query("fiery");
query bird = query("bird");
query wind = query("wind");
這裡就用到了query的建構函式。①
再就按照運算順序,從左往右:
andquery and = firey & bird;
這裡就要用到andquery的建構函式。②
不過,andquery類是從binaryquery類繼承而來,
所以在呼叫到andquery的建構函式之前,
需要呼叫binaryquery類的建構函式。③
binaryquery類是從query_base繼承而來,
我們在query_base中沒有看到建構函式,但是編譯器會合成乙個建構函式。
所以,這裡又呼叫了query_base的建構函式。④
當全部構造完畢。
andquery and = firey & bird;
就計算完成了。
最後,orquery or = and | wind;
這裡首先呼叫了orquery的建構函式。⑤
剩下的過程與andquery呼叫建構函式的情況相同。
(b)
((fiery & bird) | wind)
(c)
因為在orquery中,eval有過載,所以eval()也是呼叫的orquery的。
練習15.35
實現query類和query_base類,其中需要定義rep而無須定義eval。
解答:類的實現參照書中的實現。
只定義rep是要為了列印而用的。
練習15.36
在建構函式和rep成員中新增列印語句新增答應語句,執行你的**以檢驗你對本節第一題中(a)(b)兩小題回答是否正確:
解答:練習15.37
如果在派生類中含有shared_ptr型別的成員而非query型別的成員,則你的類需要作出怎麼樣的改變?
解答:如果使用書中原始碼,需要改的東西還真的挺多的。
為了表明這題的意義,這裡引用別的blog中的文章,對基類指標進行分析。
在類似c的強行轉換會比shared_ptr要明了很多,當然這裡還需要注意shared_ptr的使用。
練習15.38
下面的宣告合法嗎?如果不合法請解釋原因;如果合法,請指出該宣告的含義。
binaryquery a = query("fiery") & query("bird");
andquery b = query("fiery") & query("bird");
orquery c = query("fiery") & query("bird");
解答:都不合法,都缺少轉換函式,無法完成query向orquery, andquery, binaryquery的隱式轉換。
第十五章 15 2 1節練習
終於到15章了,物件導向程式設計 之前一直對這種設計方式沒有什麼概念,這裡把概念在這裡再提一下吧。物件導向程式設計 object oriented programming 的核心思想是資料抽象 繼承和動態繫結。通過使用資料抽象,我們可以將類的介面與實現分離 見第七章 使用繼承,可以定義相似的型別並對...
第十五章 15 2 3節練習
練習15.8 給出靜態型別和動態型別的定義。解答 這裡的靜態型別和動態型別是指在繼承關係中的兩種表示式或變數。引用 表示式的靜態型別在編譯時總是已知的,它是變數宣告時的型別或表示式生成的型別 引用 動態型別則是變數或表示式表示的記憶體中的物件的型別。動態型別知道執行時才可知。練習15.9 在什麼情況...
第十五章 15 3節練習
練習15.11 為你的quote類體系新增乙個名為debug的虛函式,令其分別顯示是每個類的資料成員。解答 void quote debug void bulk quote debug 練習15.12 有必要將乙個成員函式同事宣告成override和final嗎?為什麼?解答 相應情況下應該是有必要...