C++隱藏機制

來源:互聯網
上載者:User

標籤:是什麼   參數   virtual   問題   沒有   技巧   簡便   情況   區別   

大家都覺得很自然,但是沒有注意到一個小插曲,就是這個foo()觸發的隱藏機制: 衍生類別的foo()由於函數名,參數與基類都相同,然而又沒有virtual修飾,因此不可避免地會觸發隱藏。(一旦有virtual修飾就成覆蓋了!搞不清楚隱藏何時觸發的同學請百度:重載、覆蓋、隱藏的區別)  問題是,看到有同學問: 為什麼此處觸發隱藏了,p和ptr在調用foo()的時候仍然調用基類的,不是被隱藏了嗎??? 這麼問的原因是,很多同學知道了有隱藏這麼回事,但是不清楚隱藏觸發後會發生什麼。 隱藏機制觸發之後,指標的調用取決於指標的類型。如果定義的是衍生類別指標,則該基類成員不可見(隱藏),但是若為基類指標,該基類成員仍然是可見的啊!因為此處的p和ptr均為基類指標,只是分別指向了基類和衍生類別對象,所以調用foo()的時候仍然是基類的成員。但是如果定義個衍生類別指標pb,如下: B *pb=&b; pb->foo(); 這時只會調用衍生類別的foo(),雖然B繼承自A,但是基類的foo()會被隱藏。 這樣看起來似乎莫名其妙,因為你想當然地認為衍生類別的指標肯定調用自己的成員啊,隱藏存在的意義是什嗎?就像此題,不用考慮它我也能做對! 但是一旦foo()裡有參數的時候,你就會大吃一驚!假設A中為void foo(float a),B中為void foo(int a):  做如下調用: B *pb=&b; pb->foo(3.14); 到底會調用誰?你可能會想: 首先foo()成 員不是虛函數,但是B繼承A,B中有兩個foo(),調用foo(3.14)時根據參數類型應該匹配基類的void foo(float)成員。 然而並不是!因為觸發了隱藏機制,基類的void foo(float)會被隱藏,所以即使你調用foo(3.14)仍然只會調用衍生類別的void foo(int)成員。 你的驚訝正好解釋了隱藏機制存在的意義。(PS:牛客網上C/C++專項訓練上有專門一道題考察這種情況,當時解釋裡提出隱藏機制時大多數人也是一臉懵逼)   總結:1.判斷要點:如果不是重載也不是覆蓋,衍生類別和基類中一旦出現同名函數,一定觸發隱藏機制(這是個簡便判斷技巧,你可以考慮除去重載和覆蓋的任何同名函數情況,一定滿足隱藏機制觸發的兩條規則)。2.隱藏觸發的結果:指標對成員的函數調用取決於指標類型。若本身是基類指標(不管指向基類還是衍生類別)則仍然調用基類成員(不會牽扯到衍生類別,此處是隱藏,和多態沒關係,按第1點已說明隱藏的觸發可以首先排除覆蓋,也就是多態問題);若本身是衍生類別指標,這時你就會看到隱藏的威力!此時不是簡單地繼承基類的成員,然後根據參數匹配調用,而是隱藏基類成員,只會調用衍生類別成員。

C++隱藏機制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.