码迷,mamicode.com
首页 > 其他好文 > 详细

基类中的虚方法到底有什么作用?

时间:2014-07-31 16:25:47      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:blog   使用   os   ar   div   line   new   log   

只有基类的方法加上关键字virtual后才可以被override,从而实现面向对象最重要的特征--多态性,即基类可以使用派生类的方法.

C#中指出:普通的方法重载:指的是类中两个以上的方法(包括隐藏的,继承而来的方法)取的名字相同,只要使用的参数类型或者参数个数不同,编译器便知道在何种情况下应该调用哪个方法。   
而在派生类中重新定义此虚函数时要求的是:方法名称、返回值类型、参数表中的参数个数、类型、顺序都必须与基类中的虚函数完全一致。

简单一点说就是子类中override的方法能够覆盖积累中的virtual方法,当你把一个子类的实例转换为基类时,调用该方法时还是调用的子类的override的方法。

一个类里面两个名字一样的函数叫“重载”,基类和继承类里面名字一样的函数叫“重写”,重写就必须使用虚函数。

只有基类的方法加上关键字virtual后才可以被派生类override,从而实现面向对象最重要的特征--多态性,即基类可以使用派生类的方法

父類中的方法重載,提供了某行為的不同實現方法(傳入不同的參數);   
  在子類中對父類相應方法的重載﹐可以這樣理解(但實際編譯過程不是這樣)﹐子類完全copy父類代碼后﹐把重載(override)的那部分代碼挖去并用子類新的代碼補上。如果子類沒有重載(沒使用override關鍵字)而有和父類完全一樣的方法,可以這樣理解﹐子類并沒有挖去代碼﹐只是簡單覆蓋﹐當要使用繼承來的代碼時﹐只需要類型轉換就可以把覆蓋的代碼浮現出來。   
  比如:   
 

 class   A{   
      public   virtual   void   MA(string   s)   
            {Console.WriteLine("class   A:"   +   s);}   
      public   virtual   void   MA(int   i)   
            {Console.WriteLine("class   A:"   +   i.ToString());}     
  }   
    
  class   B:A{   
      public   override   void   MA(string   s)   //完全取代父類代碼   
            {Console.WriteLine("class   B:"   +   s);}   
      public   new   void   MA(int   i)                 //暫時覆蓋父類代碼   
            {Console.WriteLine("class   B:"   +   i.ToString());}       
  }   
    
  void   Main(){   
          B   b=new   B();   
          A   a=(B)b;     //convert   B-->A   
          a.MA("li");   
          a.MA(100);}   
    
  output:   
      class   B:li   
      class   A:100

  

基类中的虚方法到底有什么作用?,布布扣,bubuko.com

基类中的虚方法到底有什么作用?

标签:blog   使用   os   ar   div   line   new   log   

原文地址:http://www.cnblogs.com/whu-dhk/p/3880708.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!