成員函式的查詢過程要涉及到三個步驟。首先,編譯器查詢函式的名字,然後從後續的函式選擇乙個最匹配的函式,最後,編譯器檢查函式的訪問許可權。
大多數與函式名不匹配的錯誤並不是編譯器本身的問題,而是我們對成員函式查詢機制的理解有問題。考慮下面的**:
class b ;
class d : public b ;
//...
d d;
d.f( 12.3 ); // 令人困惑
那個成員函式f會被呼叫呢?我們來分析一下:
1 因為我們是在呼叫d的物件,所以先在d的定義中查詢,得到d::f
2 選擇最匹配的函式,現在只有乙個,所以只能是void f( int ); (引數12。3從double轉換成int 12)
這樣的轉換雖然是合法的,但是通常不是我們所希望的。因為有精度丟失。
3 檢查訪問許可權,d中void f( int );是私有的,所以我們會得到乙個編譯錯誤。
從上面的例子我們可以看到:
即使在基類中有更匹配的函式存在,但是一旦編譯器在派生類中找到了成員函式,(不管有沒有最匹配的函式存在)它也不會
再在基類中繼續查詢。可以用一句話來概括,內層作用域的名字會隱藏外層的同名函式
15 成員函式的分離
1 標頭檔案的宣告 pragma once 表示的是只包含一次 ifndef a h意思是 if not define a.h 如果不存在a.h 接著的語句應該 define a h 就引入a.h 最後一句應該寫 endif 否則不需要引入 ifndef teacher2 h define teac...
3 1 成員函式,物件拷貝,私有成員
主main函式 include include time.h 成員函式,物件拷貝,私有成員 1 綜述 2 類基礎 3 成員函式 4 物件的拷貝 5 私有成員 using namespace std struct student class time void inittime int tmphour...
42 成員物件
成員物件就是類的成員是物件型別,在類當中定義物件。例1 在類內定義中將另乙個類的物件作為成員 在類內定義中將另乙個類的物件作為成員 include class a class b void main 結果輸出為 10。例2 在類內定義乙個指向其他類物件例項的指標 在類內定義乙個指向其他類物件例項的指...