C++与C#的区别

admin 2014年02月22日 C C# C++学习 581次阅读 查看评论

  1. 继承

  C#不允许多重继承(接口除外,接口可以多重继承),C++可以,因为C++有虚基类可以解决冲突问题,即class B: virtual public A, class C: virtual public A, class D: public B, public C, 这样在D中只有A的一份拷贝,但C#没有,因此C#中Virtual不能用于修饰类。

  2. 关于抽象类

  C++中包含抽象方法的类是抽象类,不能被实例,而所谓的抽象方法也只是virutal XXX = 0;而并没有一个专用的关键字,C#中有abstract关键字,可用于修饰方法和类,抽象类也是不能被实例,这和C++一样,抽象方法声明只是以一个分号结束,并且在签名后没有大括号 ({ }),基本上和C++一样,区别只在于它有一个专用的关键字。

  3. 关于接口

  C++中没有接口,作为替代品,可以将所有的方法都定义为virtual XXX = 0,C#中有Interface,并且还可以加访问控制的,但奇怪的是既然是接口为什么会有private的?VS默认生成的接口是一定要手动加上public的,接口与abstract的区别是接口中没有成员,只有方法,是根据对外表现定义的,abstract可以有成员和方法的实现,是根据一些类的共性定义出来的,是根据一类对象的内在共性定义的。由于在C#中规定子类必须实现abstract方法,不然编译出错,所以很显然,普通类中不能包含abstract的方法。在C#中接口里面的方法前不能加修饰符,既不用也不能加public, abstract, virtual 之类的。

  4. 关于virtual

  C++和C#中都有virtual,均是为了多态,C#中子类用override来重写,C++中还是用virtual。在C#中,对于接口中的方法,子类实现时只需加public 即可,abstract和virtual方法都是用override。

  5. 关于sealed

  C#中引入sealed表示一定类不能再被继承,用来表明自己是最终版,当应用于方法或属性时,sealed修饰符必须始终与override一起使用,当用于类时可以直接使用。显然sealed不能修饰抽象类。

  一个非常好的例子:

  class Program

  {

  /// <summary>

  /// 定義一個基類"MyBaseClass"

  /// </summary>

  public class MyBaseClass

  {

  /// <summary>

  /// 定義一個方法

  /// </summary>

  public void DoA()

  {

  Console.WriteLine("MyBaseClass . Base DoA()");

  }

  }

  /// <summary>

  /// 定義個繼存類MyInheritClass繼承MyBaseClass類

  /// </summary>

  public class MyInheritClass : MyBaseClass

  {

  /// <summary>

  /// 此地方表示隱藏基類MyBaseClass中的DoA方法,並重寫方法

  /// </summary>

  new public void DoA()

  {

  Console.WriteLine("MyBaseClass . Inherit Base DoA()");

  //運行基類MyBaseClass的DoA方法

  base.DoA();

  }

  /// <summary>

  /// 定義一個虛方法

  /// </summary>

  public virtual void DoB()

  {

  Console.WriteLine("MyBaseClass . Inherit Base DoB()");

  }

  }

  /// <summary>

  /// 定義抽象類MyAbstractClass繼承類MyInheritClass

  /// </summary>

  /// abstract

  public abstract class MyAbstractClass : MyInheritClass

  {

  /// <summary>

  /// 隱MyInheritClass類的方法,重新定義抽象方法

  /// </summary>

  new public abstract void DoA();

  /// <summary>

  /// 重寫基類MyInheritClass方法,此方法為新的方法

  /// </summary>

  public override void DoB()

  {

  Console.WriteLine("MyBaseClass . abstract override DoB() ");

  //此時將調用MyInheritClass類中的方法

  base.DoA();

  }

  }

  /// <summary>

  /// 定議密封類MySealedClass繼承抽像類MyAbstractClass

  /// </summary>

  public sealed class MySealedClass : MyAbstractClass

  {

  /// <summary>

  /// 重寫基類MyAbstractClass的抽象方法

  /// </summary>

  public override void DoA()

  {

  Console.WriteLine("MyBaseClass . sealed DoA() ");

  }

  /// <summary>

  /// 密封重寫MyAbstractClass方法

  /// </summary>

  public sealed override void DoB()

  {

  Console.WriteLine("MyBaseClass . sealed override DoB() ");

  }

  public void CallBase()

  {

  //此時不是調用基類MyBaseClass(抽象類)的方法是調用MyAbstractClass類的方法

  base.DoB();

  //此處報錯。因為繼承抽象的方法無法調用原始方法

  //base.DoA();

  }

  }

  static void Main(string[] args)

  {

  //實例化基類並調用基類方法

  MyBaseClass BaseClasee = new MyBaseClass();

  BaseClasee.DoA();

  //實例化繼承類,並調用繼承類方法

  MyInheritClass InheritCalss = new MyInheritClass();

  InheritCalss.DoA();

  InheritCalss.DoB();

  //實例化密封類,並調用方法

  MySealedClass SealedClass = new MySealedClass();

  SealedClass.DoA();

  SealedClass.DoB();

  SealedClass.CallBase();

  Console.ReadKey();

  }

  }

« 上一篇 下一篇 » admin原创文章,转载请注明出处! 标签:C++c#asp.net

相关日志:

«   2019年7月   »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  [查看权限]
网站分类
文章归档
网站收藏
友情链接
图标汇集