C# 虚方法

当方法被定义为virtual时,表明方法为虚方法。

虚方法的作用:提供子类重写(override)父类方法的权利。(java中所有方法默认为虚方法)

一个子类如果想改变父类中的非虚方法功能,可以使用new关键字隐藏父类方法。

声明类与实例类不同时(声明类是实例类父类)。

首先在声明类中查找当前方法,如果没找到,再到声明类的父类中去找直到找到为止。

找到后检查该方法是否为虚方法,如果为非虚方法立即调用。如果为虚方法,从实例类中开始找,找不到再在其父类中找,直到找到为止,找到后立即执行。

例:

 1     public class A
 2     {
 3         public string GetUnvirtual()
 4         {
 5             return "A.Unvirtual";
 6         }
 7         public virtual string GetVirtual()
 8         {
 9             return "A.Virtual";
10         }
11     }
12
13     public class B : A
14     {
15         new public string GetUnvirtual()
16         {
17             return "B.Unvirtual";
18         }
19         public override string GetVirtual()
20         {
21             return "B.Virtual";
22         }
23     }
24
25     public class C : B
26     {
27         new public string GetUnvirtual()
28         {
29             return "C.Unvirtual";
30         }
31         public override string GetVirtual()
32         {
33             //return base.GetVirtual();
34             return "C.Virtual";
35         }
36     }

C c = new C();

A a = c;

a.GetUnvirtual(); 返回 "A.Unvirtual"

a.Getvirtual(); 返回 "C.Virtual"

  

时间: 2024-08-23 00:20:25

C# 虚方法的相关文章

访问祖先类的虚方法(直接访问祖先类的VMT,但是这种方法在新版本中未必可靠)

访问祖先类的虚方法 问题提出 在子类覆盖的虚方法中,可以用inherited调用父类的实现,但有时候我们并不需要父类的实现,而是想跃过父类直接调用祖先类的方法. 举个例子,假设有三个类,实现如下: type TClassA = class procedure Proc; virtual; end; TClassB = class(TClassA) procedure Proc; override; end; TClassC = class(TClassB) procedure Proc; ove

C++ 纯虚方法

1.纯虚方法解决什么样的问题,为什么要设计出纯虚方法? 考虑下面的需求,基类声明了一个方法,这个方法只针对具体的子类才有意义,比如Animal的Eat()方法,调用Animal的Eat方法是没有意义的.比如Dog吃肉,Cat吃鱼,而Animal吃什么呢,没有意义.2.既然Animal调用Eat没有意义,如何禁止Animal调用Eat方法呢? 不允许实例化出来Animal对象,Animal调用没有意义,要求子类必须重写.3.virtual void Eat()=0; 使Animal成为抽象类,不能

C# 方法 虚方法的调用浅谈 引用kdalan的博文

我们在面试中经常碰到有关多态的问题,之前我也一直被此类问题所困扰,闹不清到底执行哪个方法. 先给出一道简单的面试题,大家猜猜看,输出是? public class A    {        public void MethodF()         {             Console.WriteLine("A.F");         }        public virtual void MethodG()         {             Console.Wr

C#虚方法和抽象方法区别

虚方法: 1.virtual方法表示此方法可以被重写, 也就是说这个方法具有多态.父类中的方法是通用方法,可以在子类中重写以重新规定方法逻辑.2.virtual方法可以直接使用,和普通方法一样.3.不是必须重写的. 子类可以使用base.方法 的方式调用, 无论有没有在子类使用override去重写.virtual关键字只是明确标示此方法可以被重写, 其实它和一般的方法没有什么区别相应的sealed关键字标示此方法不可以被重写 抽象方法: 1.抽象方法没有提供实现部分. 2.抽象方法只能在抽象类

OO 抽象方法与虚方法的区别

 抽象方法与虚方法的区别 抽象方法与虚方法的区别: 一.抽象方法: 1.只能在抽象类中定义: 2.不能有方法的实现:(方法体)[因为抽象类无法实例化,所以抽象方法没有办法被调用,也就是说抽象方法永远不可能被实现.] 3.被子类继承后,必须重写: 4.使用关键字abstract修饰: 二.虚方法: 1.可以在抽象类和普通类中定义: 2.可以有方法的实现(方法体,即使空的也要声明) 3.被子类继承后,可以重写也也可以不重写: 4.使用关键字virtrual修饰:

虚方法

当类中的方法声明前加上了virtual   修饰符,我们称之为虚方法,反之为非虚.使用了virtual   修饰符后,不允许再有static,   abstract,   或override   修饰符.       示例1:带有虚方法的类       using   System   ;       public   class   DrawingBase       {       public   virtual   void   Draw(   )       {   Console.W

虚方法virtual详解

虚方法virtual详解 从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢?一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死了的!而虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象实例来动态判断要调用的函数,其中那个申明时定义的类叫申明类,那个执行时实例化的类叫实例类. 如:飞禽 bird = new 麻雀();那么飞禽就是申明类,麻雀是实例类. 具体的检查的流程如下 1.当调用一个对象的函数时,系统会直接去检

面向对象:继承、抽象类、抽象方法、虚方法

1.继承什么是继承?目的:代码重用public class 子类:父类{ }父类 基类 被继承的类子类 派生类 需要继承的类 父类构造函数的继承创建子类对象时,先调用父类构造函数,再调用子类构造函数默认调用父类无参构造函数如果子类有无参构造函数,要求父类也有无参构造函数如果调用父类的有参构造函数,显式用base调用 public 子类(参数列表)base(实参)实参:要调用的父类的有参构造函数的参数列表{} base:父类对象(父类实例) 2.抽象abstract 抽象方法:访问修饰符 abst

虚方法virtual、抽象方法abstract、接口interface区别

接口.抽象类.抽象方法.虚方法: 这四个名词时非常容易混淆的: 首先说一下接口 与抽象类 的异同: 相同点: 1.他们都不能实例化自己,也就是说都是用来被继承的. 2.抽象类中的抽象方法和接口方法一样,都不能有方法体 不同点: 1.抽象类里可以有字段,接口中不能有字段. 2.抽象类中的普通方法可以有方法体,而接口方法没有方法体. 3.接口中的方法不能有访问修饰符,抽象类中的抽象方法被继承,需要override重写 . 4.接口更像是一种规范,一种约束. 5.一个子类只能继承一个抽象类,但却可以继