詳解一道C++筆試題考察重載、覆蓋、多態(tài)x范文_第1頁
詳解一道C++筆試題考察重載、覆蓋、多態(tài)x范文_第2頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、詳解一道c+筆試題,考察重載、覆蓋、多態(tài)x 詳解一道 c+ 筆試題,考察重載、覆蓋、多態(tài) c+版看到的,說是面試寶典里的題目,考察重載、覆蓋、多態(tài)等概念,比較有代表性。今天早上遠程輔導(dǎo) yan wang 同學(xué)學(xué)習(xí) qt 時還想到了這個題目,如果你能夠正確理解這個題目,說明對于 c+ 中的函數(shù)重載、覆蓋、虛函數(shù)、多態(tài)等有了正確的認識。然后呢,再來學(xué)習(xí) qt 就順風(fēng)順水了。 題目是醬紫的: #include iostream> #include string> using namespace std; class a protected: int m_data; public: a(i

2、nt data = 0) m_data = data; int getdata() return dogetdata(); virtual int dogetdata() return m_data; ; class b : public a protected: int m_data; public: b(int data = 1) m_data = data; int dogetdata() return m_data; ; class c : public b protected: int m_data; public: c(int data = 2) m_data = data; ;

3、void main() c c(10); cout c.getdata() endl; cout c.a:getdata() endl; cout c.b:getdata() endl; cout c.c:getdata() endl; cout c.dogetdata() endl; cout c.a:dogetdata() endl; cout c.b:dogetdata() endl; cout c.c:dogetdata() endl; 程序運行后的輸出結(jié)果是什么? 答案是:1 1 1 1 1 0 1 1 追問一下,去掉 a 類中 dogetdata() 函數(shù)的 virtual 修飾,

4、程序運行后的輸出結(jié)果是什么? 答案是:0 0 0 0 1 0 1 1 說說我對這個題目的理解。 首先我們從對象的角度來看一下。 先看 main() 函數(shù)中構(gòu)造 c 對象的語句: c c(10); 這句產(chǎn)生下面的效果: • c.m_data = 10; b1 • (a)c).m_data = 0; 為什么呢? c c(10); 這行代碼,定義了 c 對象,但實際上內(nèi)存中有三個對象: 1 class c 的實例對象,即 c 2 c b 的派生類,會產(chǎn)生一個 class b 實例對象,即 (b)c 3. 由于 b 是 a 的派生類,會產(chǎn)生一個 a 實例對象,即 (a)c 每個對象

5、都有 m_data 成員變量, 根據(jù)繼承關(guān)系,子類覆蓋父類的同名成員(變量、函數(shù)), c 對象中實際上有三個同名的 m_data 變量,你通過不同的身份去看,會看到不同的 m_data 。 c 對象生成時,調(diào)用 b 、a 類的構(gòu)造函數(shù),對 b 、 a 初始化,結(jié)果就是: c 對象的 m_data = 10; b1; • (a)c) 對象的 m_data = 0. 這就是我們一開始給出的效果。 明白了對象的關(guān)系和 m_data 成員的值。咱們再來看 getdata() 函數(shù)。 getdata() 函數(shù)是 class a 的一個普通方法,根據(jù)繼承關(guān)系, b 、 c 類都可以訪問 方法,因

6、為 b 、 c 沒有重寫 getdata() ,所以通過 b 、 c 的對象訪問 getdata() ,訪問的都是 a 的 getdata() 方法。 在 getdata() 中,調(diào)用了 dogetdata() ,注意了,這是個虛函數(shù)!如果 a 的后裔重寫了 dogetdata() 函數(shù),那么這里實際上會調(diào)用到繼承關(guān)系上處于最底層的那個類的 dogetdata() 函數(shù),這就是虛函數(shù)和多態(tài)的概念。如你所見, b 重寫了 dogetdata() 函數(shù),所以當你調(diào)用 c.getdata() , b 的 dogetdata() 會被調(diào)用, (b)c).m_data 被返回。其實在 qt 中,這種用法

7、比比皆是。 好啦,下面分析 main() 函數(shù)的輸出結(jié)果。 dogetdata() 帶 帶 virtual 關(guān)鍵字 關(guān)鍵字 c.a:getdata() / c.getdata() / c.b:getdata() / c.c:getdata() 這些語句,都是調(diào)用 a:getdata() ,最終都調(diào)用 (b)c).dogetdata(), 就是b:do,訪問的是 b 的對象,它的 m_data = 1 ,所以 dogetdata() 返回 1 ,最終 getdata() 返回 1 。 c 類沒有定義 dogetdata() 函數(shù),c.dogetdata() 等同于 (b)c).dogetdata

8、() , 訪問的是 b 的對象,它的 m_data = 1 ,所以 c.dogetdata() 結(jié)果是 1 。 c.a:dogetdata() ,類域作用符限定了調(diào)用 a:dogetdata(),訪問 a 的對象,返回 (a)c).m_data = 0 。 c.b:dogetdata() / c.c:dogetdata() 最終都是訪問 b 對象的 dogetdata() 方法, 返回都是 1 。 所以 dogetdata() 帶 virtual 關(guān)鍵字,程序輸出 1 1 1 1 1 0 1 1 。 去掉 去掉 dogetdata() 的 virtual 關(guān)鍵字 關(guān)鍵字 因為 getdata() 是 a 類的方法,而 dogetdata() 不是虛函數(shù), a 類的 getdata() 內(nèi)調(diào)用的 dogetdata() 方法只可能是 a 的對象的方法,(a)c).m_data = 0 ,所以前四個 cout 結(jié)果都是 0 。 c.dogetdata() ,c 的對象內(nèi)沒有實現(xiàn)這個函數(shù),調(diào)用父類的,即 b 的對象的 dogetdata() 方法,訪問的 m_data 是 (b)c) 對象的,是 1 。 c.a:dogetdata() ,調(diào)用 a 的方法,訪問 a

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論