作用域與成員函式
在基類和派生類中使用同一名字的成員函式,其行為與資料成員一樣:在派生類作用域中派生類成員將遮蔽基類成員。即使函式原型不同,基類成員也會被遮蔽。
class base
};class child:public base
};
child c=child();
cout<
區域性作用域中宣告的函式不會過載全域性作用域中定義的函式,同樣,派生類中定義的函式也不過載基類中定義的成員。通過派生類物件呼叫函式時,實參必須與派生類中定義的版本相匹配,只有在派生類根本沒有定義該函式時,才考慮基類函式。
過載函式
像其他任意函式一樣,成員函式(無論虛還是非虛)也可以過載。派生類可以重定義所繼承的0個或多個版本。
如果派生類重定義了過載成員,則通過派生型別只能訪問派生類中重定義的那些成員。
class base
double get(double i)
};class child:public base
};
如果派生類想通過自身型別使用所有的過載版本,則派生類必須要麼重定義所有過載版本,要麼乙個也不重定義。
派生類不用重定義所繼承的每乙個基類版本,它可以為過載成員提供using宣告,乙個using宣告只能指定乙個名字,不能指定形參表。
15.5.4 虛函式與作用域
要獲得動態繫結,必須通過基類的引用或指標呼叫虛函式。
class base
};class child:public base
};
base c1=child();
cout通過基類型別的引用或指標呼叫函式時,編譯器將在基類中查詢該函式而忽略派生類。
確定函式呼叫遵循以下四個步驟:
(1)首先確定進行函式呼叫的物件、引用或指標的靜態型別。
(2)在該類中查詢函式,如果找不到,就在直接基類中查詢,如此循著類的繼承鏈往上找,直到找到該函式或者查詢完最後乙個類。如果不能在類或者相關基類中找到該名字,則呼叫是錯誤的。
(3)一旦找到了該名字,就進行常規型別檢查,檢視如果給定找到的定義,該函式呼叫是否合法。
(4)假定函式呼叫合法,編譯器就生成**。如果函式是虛函式且通過引用或指標呼叫,則編譯器生成**以確定根據物件的動態型別執行哪個版本函式,否則,編譯器生成**直接呼叫函式。
C 未知點 作用域與成員函式
c primer p499 在基類和派生類中使用同一名字的成員函式,在派生類作用域中派生類成員將遮蔽基類成員,即使函式原型不同,基類成員也會被遮蔽 struct base struct derived base int main 注1 派生類中定義的函式也不過載基類中定義的成員。通過派生類物件呼叫函...
函式與作用域
函式宣告 function add a,b return a b 函式表示式 function variable 函式變數 varadd function a,b ief immediately excuted function 立即執行函式 function first class functio...
塊級作用域與函式作用域
函式作用域 變數在定義的環境中以及巢狀的子函式中處處可見 塊級作用域 變數在離開定義的塊級 後立即被 在es6之前,js的作用域只有兩種 函式作用域和全域性作用域。使用var宣告的變數,都存在變數提公升的過程。console.log a undefined console.log c undefin...