由虚方法谈到实例在编译和运行时的类型

本文探讨了虚方法与非虚方法的区别,关键在于虚方法调用时由实例的运行时类型决定调用的具体实现,而非虚方法则由编译时类型决定。通过示例代码解释了A类和其子类B中虚方法和非虚方法的调用行为,展示了实例在编译时和运行时类型的差异,以及它们如何影响方法调用的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     今天想温故而知新,想更彻底的了解下虚方法,估计大多数人跟我一样对虚方法很多的认识仅在于---------------------方法名前有virtual修饰的就被称为虚方法,无virtual修饰的方法称为非虚方法.

 

     虚方法与非虚方法有啥区别呢?其实很关键的一点就是-----------------------在一个虚拟方法调用中,该调用所涉及的那个实例的运行时类型确定了要被调用的究竟是该方法的哪一个实现。在非虚拟方法调用中,相关的实例的编译时类型是决定性因素。

 

     那么实例在编译和运行时的类型分别是什么呢?eg A a= new B();____A,B都为一个类.那么a实例在编译时候的类型就是A,而运行时候的类型就为B.

 

     Eg:

       

using System;

class A

{

   public void F() { Console.WriteLine("A.F"); }

   public virtual void G() { Console.WriteLine("A.G"); }

}

class B: A

{

   new public void F() { Console.WriteLine("B.F"); }

   public override void G() { Console.WriteLine("B.G"); }

}

class Test

{

   static void Main () {

      B b = new B();

      A a = b;

      a.F();

      b.F();

      a.G();

      b.G();

   }

}

那么输出结果就是A.F   B.F  B.G   B.G

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值