1. 程式人生 > >C#中“覆蓋”和“隱藏”的區別

C#中“覆蓋”和“隱藏”的區別

    在C#中,如果一個類的某個方法加了vitual的描述符,那麼表示你可以在這個類的子類中重新實現該方法。Java中沒有這麼多廢話,一個public或者protected方法不需要新增其它的描述符就可以在子類中被覆蓋。
class Program {
        
staticvoid Main(string[] args) {
            Children c 
=new Children();
            Console.WriteLine(c.GetNumber());
            Console.WriteLine(((Father)c).GetNumber());
        }
    }

    
class Father {
        
publicvirtualint GetNumber() {
            
return1;
        }
    }

    
class Children : Father {
        
publicoverrideint GetNumber() {
            
return2;
        }
    }

結果:
2
2
    如果我們去掉Father類中GetNumber()方法的vitual描述符,那麼在編譯程式的時候會報錯:
錯誤    1    “ConsoleApplication5.Children.GetNumber()”: 繼承成員“ConsoleApplication5.Father.GetNumber()”未被標記為 virtualabstract 或 override,無法進行重寫    D:我的文件Visual Studio 
2005ProjectsWindowsApplication1ConsoleApplication5Program.cs    2329    ConsoleApplication5
    這說明,如果在C#程式中,如果不在父類的方法中新增virtual、abstract或者override描述符,那麼編譯器就會認為你不想在子類中覆蓋這個方法。如果我們同時去掉Children類中GetNumber()方法的override描述符,程式可以編譯通過,但是這時就不是覆蓋了,而是C#中的“隱藏”關係。“隱藏”和“覆蓋”具體區別就是,如果是“隱藏”,那麼在通過Father型別的引用呼叫一個Children物件的GetNumber()方法的時候,實際執行的部分是父類中的GetNumber()方法,而不是子類的。
    因此,可以簡單的這麼理解,“覆蓋”就是重新實現了父類的方法,而“隱藏”只是把父類中的方法藏了起來,通過父類的引用來呼叫這個方法的時候,這個被“隱藏”的方法就被激活了。
class Program {
        
staticvoid Main(string[] args) {
            Children c 
=new Children();
            Console.WriteLine(c.GetNumber());
            Console.WriteLine(((Father)c).GetNumber());
        }

    }


    
class Father {
        
publicint GetNumber() {
            
return1;
        }

    }


    
class Children : Father {
        
publicint GetNumber() {
            
return2;
        }

    }

結果:
2
1

相關推薦

C#覆蓋隱藏”的區別

    在C#中,如果一個類的某個方法加了vitual的描述符,那麼表示你可以在這個類的子類中重新實現該方法。Java中沒有這麼多廢話,一個public或者protected方法不需要新增其它的描述符就可以在子類中被覆蓋。 class Program {        st

類成員函式的過載、覆蓋隱藏區別 (C++)

      這是本人第一次寫部落格,主要是想記錄自己的學習過程、心得體會,一是可以方便以後回顧相關知識,二是可以與大家相互學習交流。       關於C++中類成員函式的過載、覆蓋和隱藏區別,第一次看到這個問題是在準備找工作的時候在牛客網中(http://www.nowcoder.com/questionT

C++類成員函式的過載、覆蓋隱藏區別

成員函式被過載(overload)的特徵:相同的範圍(在同一個類中);函式名字相同;引數不同;virtual關鍵字可有可無。覆蓋是指派生類函式覆蓋(override)基類函式,其特徵是:函式名字相同;引

類成員函數的重載、覆蓋隱藏區別

c/c++1.重載是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。實現原理上:編譯器根據函數不同的參數表,對同名函數的名稱做修飾,然後這些同名函數就成了不同的函數(至少對於編譯器來說是這樣的)。如,有兩個同名函數:function func(p:inte

類成員函式的過載、覆蓋隱藏區別

#include <iostream> #include <complex> using namespace std; class Base { public:     virtual void a(int x)    {    cout << "Base::a(int)"

C++過載覆蓋隱藏,虛擬函式與純虛擬函式

這幾個概念都有一個共同點:函式名稱相同,所以不免讓人混淆,大致的區別如下:過載(overload):必須在一個域中,函式名稱相同但是函式引數不同,過載的作用就是同一個函式有不同的行為,因此不是在一個域中的函式是無法構成過載的,這個是過載的重要特徵覆蓋(override):覆

c++區別

string.h string.h是C語言裡面關於字元陣列的函式定義的標頭檔案,常用函式有strlen、strcmp、strcpy等等,更詳細的資訊可以自己檢視(面向過程) cstring CString常用於MFC程式設計中,是屬於MFC的類,如從對話方塊中利用GetW

過載,覆蓋隱藏區別

1.過載(overload)的特徵: a).幾個函式如果是過載,那麼他們的作用域相同,即在同一個範圍內。【例如:在同一個類中,或者在同一個全域性中】 b).函式名字必須相同,但是引數必須不同【個數可以不同,型別也可以不同】 c).virtual關鍵字可有可無. 【過載的作用

類成員函式的過載、覆蓋隱藏區別

成員函式被過載的特徵 (1)相同的範圍(在同一個類中);   (2)函式名字相同;   (3)引數不同;   (4)virtual 關鍵字可有可無。   覆蓋是指派生類函式覆蓋基類函式,特徵是 (1)不同的範圍(分別位於派生類與基類);   (2)函式名字相同;   (3)引數相同;   (4)基類函式

C#closedispose區別

Close是停業整頓 Dispose是炸燬 停業了,可以通過公關,再重開。物還是原來的物 炸燬了,想再開張,就只有重頭建起 C#中解構函式是有垃圾蒐集器來呼叫的,當所引用的堆上的資料當無效時,會隱式呼叫。一般表現為當引用變數超出其作用域時就會呼叫。 Close函式和Dis

C++ #if #ifdef 區別

fde 編譯器 就是 開頭 編譯程序 如果 都是 條件 程序 以#開頭的都是預編譯指令,就是在正式編譯之前,編譯器做一些預處理的工作#if 條件語句程序段1 //如果條件語句成立,那麽就編譯程序段1#endif程序段2//如果條件不語句成立,那麽就編譯程序段2#ifndef

C++過載、覆蓋隱藏區別,以及適用場景

一、過載、覆蓋和隱藏的區別 二、適用場景 1、過載:   適用於不同的資料型別都需要使用到的功能函式。以資料相加的函式為例,可以在同一個檔案內提供以下的過載函式以支援同樣的功能:   int add(int, int);/*2個整數相加*/   int add(int, int, int);/*3個整數相

C++類成員函式的過載、覆蓋隱藏區別,超清楚!

1.成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。 2.覆蓋是指派生類函式覆蓋基類函式,特徵是: (1)不同的範圍(分別位於派生類與基類); (2)函式名字相同;

C++過載、覆蓋隱藏區別

一、過載: 是函式名相同,引數列表不同 過載只是在類的內部存在。但是不能靠返回值型別來判斷。規則如下:1、相同的範圍(在同一個類中)2、函式名字相同3、引數不同4、Virtual關鍵字可有可無、二、覆蓋: 在繼承關係中,子類中定義了與父類同名的虛擬函式,從而子類自己本身定義的

c++的過載、覆蓋隱藏

引用:http://blog.csdn.net/Kendiv/archive/<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2006/04/25/675940.aspx<?xm

C++的過載 覆蓋隱藏

一.過載overload 在同一個可訪問區域內被宣告的幾個具有不同引數列的(引數型別,個數,順序不同)同名函式,程式會根據不同的引數列來確定具體呼叫哪個函式。過載不關心函式的返回值型別,即返回型別不同步能構成過載。。此外,const成員函式也能構成過載 a.

C#覆蓋隱藏

在C++中過載、覆蓋、隱藏很讓人迷糊,剛開始接觸C#的時候關於這個用法也讓我轉了一陣子,今天有時間把我對他們的理解記錄了下來,還請各位指正。 在C++中他們是這樣定義的: 概念

Java類成員函式過載、覆蓋隱藏區別

其他擴充套件連結: 過載: 成員函式被過載的特徵: 1)相同的範圍:在同一個類中 2)函式名相同,引數不同 3)virtual可有可無 覆蓋: 派生函式覆蓋基類函式 1)位於不同的範圍內(子類

C#&&&,|||區別

.com blank img cnblogs png ref bsp 筆記 區別 當兩者都為邏輯運算符時。 其實沒什麽差別。 &&和||當已經確定結果時,不會對第二個操作數求值。也不知道什麽情況會用到這個差別。做個筆記好了。 http://blog.cs

C++typenameclass的區別

type .get true 能夠 class .... ray pla 依賴 在c++Template中很多地方都用到了typename與class這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢? 相信學習C++的人對class這個關鍵字都非常明白,clas