程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 關於C#和C++的重載(Overload)、隱藏(Hide)、覆蓋(Override)幾個區...

關於C#和C++的重載(Overload)、隱藏(Hide)、覆蓋(Override)幾個區...

編輯:關於C語言
這裡只談函數(方法)重載,C#獨有的屬性重載不在討論之內。

  1. Overload:

    基本上一致,C#多出了ref、out相關的,C++多出了const(指針和引用時)相關的。

  2. Hide:

    C#引入new;

    C++一般情況下類似,派生類會按名稱隱藏基類的方法除外。(後面提供解釋)
   
  3. Override:

    C#引入override,不能省略(缺省為new),不能更改訪問控制;

    C++能且只能省略virtual(當然是指定義時,C#聲明和定義方法不得分開),可以更改訪問控制。

    只是,在虛擬機制下(如Base * b = new  Derived();   b->Foo();),運行時類型的訪問控制並不能影響虛擬   機制准確的對運行時類型對應方法的尋址。即是說,就算Foo在Derived為private,調用的也是Derived對應的Foo。

    由《Effective C++》(M50)中:“ 這不很合理,但ARM對這種行為提供了解釋。假設調用f時,你真的是想調用Derived中的版本,但不小心用錯了參數類型。進一步假設Derived是在繼承層次結構的下層,你不知道Derived 間接繼承了某個基類BaseClass,而且BaseClass中聲明了一個帶int參數的虛函數f。這種情況下,你就    會無意中調用了BaseClass::f,一個你甚至不知道它存在的函數!在使用大型類層次結構的情況下,這種錯誤會時常發生;所以為了防患於未然, Stroustrup決定讓派生類成員按名字隱藏掉基類成員。”

    既然如此,為什麼C#中不這麼處理呢?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved