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#中不這麼處理呢?