分享

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

 orion360doc 2011-02-20

//=====================================================================
//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#中却是会遭到编译器无情的抱怨:

  1.  class CMyBase_A  
  2.  {  
  3. ...  
  4.  };  
  5.    
  6.  class CMyBase_B  
  7.  {  
  8. ...  
  9.  };  
  10.    
  11.  //CMyClass同时继承于CMyBase_A和CMyBase_B。这段代码在C#中无法通过  
  12.  class CMyClass:  
  13.   public CMyBase_A,  
  14.   public CMyBase_B  
  15.  {  
  16. ...;  
  17.  };  
  18.    
 


   是不是说,C#永远只能继承于一个父类,而无法有更多的扩展了?C#比C++多了两个+,自然不会犯如此愚蠢的错误,因为它还有一个叫做接口的东西。和只能有一个父类不一样,接口可以有多个。接口的关键字是interface,和类相似,也能够用public或internal来进行修饰。所不同的是,不能使用abstract或sealed,因为这两个关键字对于接口来说,是没有任何意义的,因为接口必须是不能实例化,且一定能够被继承的。
   
   如果以接口的方式来更改上述的代码,那么在C#中将会变更为如此:
  

  1.    class CMyBase  
  2.   {  
  3.  ...  
  4.   };  
  5.   
  6.    interface IMyBase_A  
  7.   {  
  8.  ...  
  9.   };  
  10.   
  11.    interface IMyBase_B  
  12.   {  
  13.  ...  
  14.   };  
  15.   
  16. //一个父类,多个接口  
  17.    class CMyClass:  
  18.        CMyBase,  
  19.        IMyBase_A,  
  20.        IMyBase_B  
  21.    {  
  22.        ...  
  23.  };  

  
  这里让C++程序员容易忽略的是,C#的接口的顺序是有严格规定的,接口必须排在类之后,也就是说,下面这段代码是错误的:
  1. //接口排在类的前面,该代码无法进行编译  
  2.   class CMyClass:          
  3.       IMyBase_A,  
  4. CMyBase,  
  5.       IMyBase_B  
  6.   {  
  7.       ...  
  8. };  

  
  
  C#在继承中还有一个容易让人忽略的小问题,就是派生类绝对不能比父类的的可访问权限高,如下代码所示:
  1. //父类为internal  
  2. internal class CMyBase  
  3. {   
  4.  ...  
  5.   }  
  6.   
  7. /派生类为public,无法通过编译  
  8.   public class CMyClass:  
  9.       CMyBase  
  10.   {  
  11.       ...  
  12.   };  

  
  在这段代码中,父类的CMyBase被internal所修饰,而派生类CMyClass被public修饰,因为public的可访问权限远远高于internal,违反了派生类可访问权限要低于父类的规定,所以这段代码无论如何也不能通过编译。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多