在C++中重載、覆蓋、隱藏很讓人迷糊,剛開始接觸C#的時候關於這個用法也讓我轉了一陣子,今天有時間把我對他們的理解記錄了下來,還請各位指正。
在C++中他們是這樣定義的:
概念 |
範圍 |
參數 |
基類中為virtual? |
| 重載overload |
同一個類中 |
不同 |
y/n |
| 覆蓋override |
繼承 |
相同 |
y |
| 隱藏hide |
繼承 |
相同 |
n |
不同 |
y/n |
覆蓋和重寫(override)是一個意思:
主要是指你在基類裡面定義了一個virtual函數,在衍生類別中重新實現了這個函數.這就叫覆蓋或者重寫
隱藏有兩種情況:
(1)如果衍生類別的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。
(2)如果衍生類別的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual 關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)
下面參照執行個體看一下:
1、覆蓋
/**//*
* 覆蓋方法的測試
*/
public class Base_Override ...{
public virtual void Introduce()...{
System.Console.WriteLine("I'm Base_Override_Introduce()");
}
public virtual void SayHi() ...{
System.Console.WriteLine("I'm Base_Override_SayHi()");
}
}
public class Derive_Override:Base_Override...{
public override void Introduce()
...{
System.Console.WriteLine("I'm Derive_Override_Introduce()");
//base.Introduce();
}
//注意,此方法沒有 override 父類的方法
//編譯時間有警告,建議添加override或new
//此方法C#中預設為隱藏,在C++這種情況應該不是隱藏 應該資料覆蓋
public void SayHi() ...{
System.Console.WriteLine("I'm Derive_Override_SayHi()");
}
public void SayHi(bool b) ...{
System.Console.WriteLine("I'm Derive_Override_SayHi(bool b)");
}
}
測試代碼如下:
Base_Override base_override = new Base_Override();
Derive_Override derive_override = new Derive_Override();
//將調用Base_Override中Introduce()
base_override.Introduce();
//將調用Base_Override中SayHi()
base_override.SayHi();
//將調用Derive_Override中Introduce()
derive_override.Introduce();
//將調用Derive_Override中SayHi()
derive_override.SayHi();
//將調用Derive_Override中SayHi(bool b)
derive_override.SayHi(true);
base_override = new Derive_Override();
//將調用Derive_Override中Introduce()
base_override.Introduce();
//將調用Base_Override中SayHi()
//** 在C++可能依然是Derive_Override中SayHi() OK
base_override.SayHi();
//將調用Derive_Override中SayHi()
((Derive_Override)base_override).SayHi();
//compile Error!
//base_override.SayHi(true);
2、隱藏
/**//*
* 隱藏方法的測試
*/
public class Base_New ...{
public void Introduce()
...{
System.Console.WriteLine("I'm Base_New_Introduce()");
}
public void SayHi()
...{
System.Console.WriteLine("I'm Base_New_SayHi()");
}
}
public class Derive_New : Base_New ...{
// 沒有加new,但C#預設行為會加上new
//編譯時間有警告,建議添加override或new
public void Introduce()
...{
System.Console.WriteLine("I'm Derive_new_Introduce()");
}
// 顯式加上new,跟不加new實際效果一樣,只是加new之後會消除compile warning
public new void SayHi()
...{
System.Console.WriteLine("I'm Derive_new_SayHi()");
}
}
測試代碼如下:
Base_New base_new = new Base_New();
Derive_New derive_New = new Derive_New();
//將調用Base_New中Introduce()
base_new.Introduce();
//將調用Base_New中SayHi()
base_new.SayHi();
//將調用Derive_New中Introduce()
derive_New.Introduce();
//將調用Derive_New中SayHi()
derive_New.SayHi();
base_new = new Derive_New();
//將調用base_new中Introduce()
base_new.Introduce();
//將調用base_new中SayHi()
base_new.SayHi();
根據測試結果,可以說明c#中的覆蓋和隱藏的區別。並且經過在C++中的同樣測試,由於C++沒有override 和 new 關鍵字約束,所以C#與C++中的用法依然存在著細微的不同。。
以上,可能存在理解錯誤的地方,還請各位網友指正。。