【C++grammar】名字隐藏与重定义
目錄
- 1、繼承中的名字隱藏
- 1.基類同名函數(shù)被隱藏的現(xiàn)象描述
- 2.問題理解
- 3.避免現(xiàn)象
- 2、重定義
- 1.現(xiàn)象描述
- 2.重定義與重載的區(qū)別
- 3.能否使用 using 將基類成員引入到派生類定義中
1、繼承中的名字隱藏
1.基類同名函數(shù)被隱藏的現(xiàn)象描述
在學(xué)習(xí)變量作用域的時(shí)候知道,全局變量可能被函數(shù)里面的同名局部變量所隱藏,如果要在函數(shù)里面使用這個(gè)同名全局變量,那么就要使用域解析運(yùn)算符。
在繼承中也會(huì)出現(xiàn)上述類似的情況,下面是名字隱藏的形式:
基類和派生類中都有一個(gè)同名函數(shù),不同的是派生類的函數(shù)有個(gè)整型形參。
在主函數(shù)中調(diào)用f(),那么調(diào)用的到底是基類的函數(shù)還是派生類的函數(shù)?
class P{public:void f(){} };class C :public P{public:void f(int x){} }; int main() {C c;c.f(); }
編譯器會(huì)報(bào)錯(cuò)。
2.問題理解
我們可以將派生類看做是內(nèi)部作用域,基類看做是外部作用域。內(nèi)部作用域的函數(shù)f()將外部作用域的f()給隱藏掉了。
那么在C類中就看不到基類中的f()同名函數(shù)了。
這個(gè)做法可以幫助程序員避免寫出帶有危險(xiǎn)性的代碼。
3.避免現(xiàn)象
那么如何解決這個(gè)問題呢?
using 聲明語句可以將基類成員引入到派生類定義中,顯式聲明。
其實(shí)還有兩種寫法:
1、
2、
class P{public:void f(){} };class C :public P{public:void f(int x){} }; int main() {C c;static_cast<P>(c).f(); }2、重定義
1.現(xiàn)象描述
名字隱藏在重定義函數(shù)的時(shí)候有比較大的作用。因?yàn)橛忻蛛[藏,所以我們可以在子類里面重新定義一個(gè)與基類里面名字參數(shù)一樣的函數(shù)
。
之前定義了基類shape:
其中,toString函數(shù)用來描述對(duì)象的信息。基類可以調(diào)用這個(gè)函數(shù),但是基類是無法輸出派生類信息的。
例如形狀就不能輸出它的派生類:圓,的半徑。只能輸出顏色和是否填充。
我們可以在派生類里面重新定義toString函數(shù)用來描述派生類對(duì)象,這樣就不會(huì)調(diào)用基類的toString函數(shù)了。
2.重定義與重載的區(qū)別
重載
多個(gè)函數(shù)名字相同,但至少以下一個(gè)特征不同:
1、參數(shù)類型(parameter type)
2、參數(shù)數(shù)量(parameter number)
3、參數(shù)順序(parameter sequence)
重定義
1、函數(shù)特征相同:同名、同參數(shù)、返回值類型
2、在基類和派生類中都有定義
3.能否使用 using 將基類成員引入到派生類定義中
派生類B中的 foo()函數(shù)是對(duì)基類A中的 foo() 函數(shù)的重定義。
那么在類B中,能否使用 using 講基類A中的foo()函數(shù)引入到派生類B中?為什么?
總結(jié)
以上是生活随笔為你收集整理的【C++grammar】名字隐藏与重定义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 344. 反转字符串
- 下一篇: 【C++grammar】多态、联编、虚函