日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++grammar】名字隐藏与重定义

發(fā)布時(shí)間:2023/12/1 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++grammar】名字隐藏与重定义 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 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 聲明語句可以將基類成員引入到派生類定義中,顯式聲明。

class P{public:void f(){} };class C :public P{public:using P::f;void f(int x){} }; int main() {C c;c.f(); }

其實(shí)還有兩種寫法:
1、

class P{public:void f(){} };class C :public P{public:void f(int x){} }; int main() {C c;c.P::f(); }

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中?為什么?

#include<iostream>#include<string>using namespace std; class A {public: string func() { return "aaa"; }};class B :public A {public:using A::func; string func() { return "bbb"; }}; int main() { A a; B b; cout<<a.func()<<endl;cout<<b.func()<<endl; }結(jié)果是:aaabbb編譯運(yùn)行正常通過,所以還是調(diào)用了 子類 的函數(shù)。

總結(jié)

以上是生活随笔為你收集整理的【C++grammar】名字隐藏与重定义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。