zoukankan      html  css  js  c++  java
  • 浅析继承关系中的方法调用

    我们首先来看一段代码:
    
    
     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Father father=new Son();
     6             father.SayHi();
     7             Console.ReadKey();
     8         }   
     9     }
    10     class Father
    11     {
    12         public void SayHi()
    13         {
    14             Console.WriteLine("我是父类的SayHi方法~!");
    15         }
    16     }
    17     class Son : Father
    18     {
    19         public void SayHi()
    20         {
    21             Console.WriteLine("我是子类的SayHi方法~!");
    22         }
    23     }再来看一下该段代码的运行结果:
    
    
    
    这时不禁有人就会问:我们new出来的是子类对象,为什么调用的是父类的方法呢???
    这就要从CLR的调用机制来解答了:
    首先每个类型(Father,Son)都有自己的方法表,CLR在调用一个方法时,会判断这个方法是不是虚方法(下文将讲解虚方法的情况).如果不是虚方法,那么就去检查这个变量类型的方法表,找到了这个方法就执行它.
    小结:
    当父类对象指向子类实例时,即 Father father=new Son()时,父类和子类都存在SayHi方法(父类SayHi是非虚方法)时,当父类调用该方法时,即father.SayHi()时,调用的是父类的SayHi方法.
    
     
    
    下面,我们来讲解父类中的方法是虚方法的情况,先看以下代码:
    
    
    
     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Father father = new Son();
     6             father.SayHi();
     7             Console.ReadKey();
     8         }
     9     }
    10     class Father
    11     {
    12         public virtual void SayHi()
    13         {
    14             Console.WriteLine("我是父类的SayHi方法~!");
    15         }
    16     }
    17     class Son : Father
    18     {
    19         public override void SayHi()
    20         {
    21             Console.WriteLine("我是子类的SayHi方法~!");
    22         }
    23     } 
    
    上面的代码运行结果是:
    
    
    
    由此可见:
    当父类调用的是虚方法,那么CLR会根据引用找到堆上的那个对象,根据对象的type pointer找到对象的真正类型(即GetType方法的返回类型),再调用该类型对应的方法,即子类的SayHi方法.
  • 相关阅读:
    sharpen和filter2D
    Changing the contrast and brightness of an image!(opencv对比度和亮度调节)
    人脸表情识别
    Pycharm下载和安装
    Anaconda下载与安装
    图像人脸检测+人眼检测 (opencv + c++)
    cv2.VideoWriter()指定写入视频帧编码格式
    python_openCV例程遇到error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale的简单解决方法
    图像处理库 Pillow与PIL
    IDE bulid构建隐藏了什么(预处理->编译->汇编->链接)
  • 原文地址:https://www.cnblogs.com/TNSSTAR/p/2653673.html
Copyright © 2011-2022 走看看