類繼承複習題

1.派生類從基類那裏繼承了什麼?
答:基類的公有成員成爲派生類的公有成員。基類的保護成員成爲派生類的保護成員。基類的私有成員被繼承,但不能直接被訪問,可以通過基類的公有成員函數來訪問。


2.派生類不能從基類那裏繼承什麼?
答:不能繼承構造函數、析構函數、賦值操作和友元。


3.假設baseDMA::operator=( )函數的返回類型爲void,而不是baseDMA &,這將有什麼後果?如果返回
類型爲baseDMA,又將有什麼後果?
答:如果返回類型爲void,仍可以賦值,但不能使用連鎖賦值:

baseDMA magazine("Pandering to Glitz",1);
baseDMA a,b,c;
a = magazine;//可以
a = b = c = magazine;//不可以

如果方法返回一個對象,而不是引用,則該方法的執行速度將有所減慢,這是因爲返回語句需要複製對象。


4.創建和刪除派生類對象時,構造函數和析構函數調用的順序是怎麼樣的?
答:按派送的順序調用構造函數,最早的構造函數最先調用。調用析構函數的的順序正好相反。


5.如果派生類沒有添加任何數據成員,它是否需要構造函數?
答:需要,每個類都必須有自己的構造函數。如果派生類沒有添加新成員,則構造函數可以爲空,但必須存在。


6.如果基類和派生類定義了同名的方法,當派生類對象調用該方法時,被調用的將是哪個方法?
答:只調用派生類方法,它取代基類定義。僅當派生類沒有重新定義方法或使用作用域解析操作符時,纔會調用基類方法。不過,應把將所要重新定義的函數聲明爲虛函數。


7.在什麼情況下,派生類應定義賦值操作符?
答:如果派生類構造函數使用new或new [ ] 操作符來初始化類的指針成員,則應定義一個賦值操作符。


8.可以將派生類對象的地址賦給基類指針嗎?可以將基類對象的地址賦給派生類指針嗎?
答:可以將派生類對象的地址賦給基類指針;也可以將基類對象地址賦給派生類指針,但是隻有通過顯示類型轉換,纔可以這麼做,而且這樣的指針不一定安全。


9.可以將派生類對象賦給基類對象嗎?可以將基類對象賦給派生類對象嗎?
答:可以將派生類對象賦給基類對象。對於派生類中新增的數據成員都不會傳遞給基類對象。不過,程序將使用基類的賦值操作符。僅當派生類定義了轉換操作符(即包含將基類引用作爲唯一參數的構造函數)或使用基類爲參數的賦值操作符,相反方向的賦值纔是可能的。


10.假設定義了一個函數,它將基類對象的引用作爲參數。爲什麼該函數也可以將派生類對象作爲參數?
答:因爲C++允許基類引用指向從該基類派生類而來的任何類型


11.假設定義了一個函數,它將基類對象作爲參數(即函數按值傳遞基類對象)。爲什麼該函數也可以將派生類對象作爲參數?
答:按值傳遞對象將調用複製構造函數。由於形參是基類對象,因此將調用基類的複製構造函數。複製構造函數以基類引用爲參數,該引用可以指向作爲參數傳遞的派生類對象,最終結果是,將生成一個新的基類對象,其成員對應於派生類對象的基類部分。


12.爲什麼通常按引用傳遞對象比按值傳遞對象的效率高?
答:按引用傳遞對象,這樣可以確保函數從虛函數受益。按引用傳遞對象可以節省內存和時間,尤其對於大型對象。按值傳遞對象的主要優點在於可以保護原始數據,但可以通過將引用作爲const類型傳遞,來達到同樣的目的。


13.假設Corporation是基類,PulicCorporation是派生類。再假設這兩個類都定義了head()成員函數,ph是指向Corporation類型的指針,且被賦給了一個PublicCorporation對象的地址。如果head()定義爲:
a.常規非虛方法;
b.虛方法;
則ph->head( )將被如何解釋?
答:a.常規非虛方法:ph->head()將調用Corporation::head()。
b.虛方法:ph->head()將調用PulicCorporation::head()。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章