程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ VS C#(9):繼承

C++ VS C#(9):繼承

編輯:C++入門知識

//=====================================================================
//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,違反了派生類可訪問權限要低於父類的規定,所以這段代碼無論如何也不能通過編譯

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