//=====================================================================
//TITLE:
// C++ VS C#(9):繼承
//AUTHOR:
// norains
//DATE:
// Thursday 17-January-2011
//Environment:
// Visual Studio 2010
// Visual Studio 2005
//=====================================================================
1. 繼承
C++和C#都有類,那麼自然而然,繼承的存在也不在話下。不過在繼承方面,兩者差異頗多。最明顯的區別在於,C++可以多重繼承,也就是說,C++能夠有多個父類,而C#只有一個。換句話來說,下面這段代碼可以在C++中順利編譯,但在C#中卻是會遭到編譯器無情的抱怨:
view plaincopy to clipboardprint?
class CMyBase_A
{
...
};
class CMyBase_B
{
...
};
//CMyClass同時繼承於CMyBase_A和CMyBase_B。這段代碼在C#中無法通過
class CMyClass:
public CMyBase_A,
public CMyBase_B
{
...;
};
class CMyBase_A
{
...
};
class CMyBase_B
{
...
};
//CMyClass同時繼承於CMyBase_A和CMyBase_B。這段代碼在C#中無法通過
class CMyClass:
public CMyBase_A,
public CMyBase_B
{
...;
};
是不是說,C#永遠只能繼承於一個父類,而無法有更多的擴展了?C#比C++多了兩個+,自然不會犯如此愚蠢的錯誤,因為它還有一個叫做接口的東西。和只能有一個父類不一樣,接口可以有多個。接口的關鍵字是interface,和類相似,也能夠用public或internal來進行修飾。所不同的是,不能使用abstract或sealed,因為這兩個關鍵字對於接口來說,是沒有任何意義的,因為接口必須是不能實例化,且一定能夠被繼承的。
如果以接口的方式來更改上述的代碼,那麼在C#中將會變更為如此:
view plaincopy to clipboardprint?
class CMyBase
{
...
};
interface IMyBase_A
{
...
};
interface IMyBase_B
{
...
};
//一個父類,多個接口
class CMyClass:
CMyBase,
IMyBase_A,
IMyBase_B
{
...
};
class CMyBase
{
...
};
interface IMyBase_A
{
...
};
interface IMyBase_B
{
...
};
//一個父類,多個接口
class CMyClass:
CMyBase,
IMyBase_A,
IMyBase_B
{
...
};
這裡讓C++程序員容易忽略的是,C#的接口的順序是有嚴格規定的,接口必須排在類之後,也就是說,下面這段代碼是錯誤的:
view plaincopy to clipboardprint?
//接口排在類的前面,該代碼無法進行編譯
class CMyClass:
IMyBase_A,
CMyBase,
IMyBase_B
{
...
};
//接口排在類的前面,該代碼無法進行編譯
class CMyClass:
IMyBase_A,
CMyBase,
IMyBase_B
{
...
};
C#在繼承中還有一個容易讓人忽略的小問題,就是派生類絕對不能比父類的的可訪問權限高,如下代碼所示:
view plaincopy to clipboardprint?
//父類為internal
internal class CMyBase
{
...
}
//派生類為public,無法通過編譯
public class CMyClass:
CMyBase
{
...
};
//父類為internal
internal class CMyBase
{
...
}
//派生類為public,無法通過編譯
public class CMyClass:
CMyBase
{
...
};
在這段代碼中,父類的CMyBase被internal所修飾,而派生類CMyClass被public修飾,因為public的可訪問權限遠遠高於internal,違反了派生類可訪問權限要低於父類的規定,所以這段代碼無論如何也不能通過編譯