谈到C#.NET的虚方法就不得不先说一下继承性(inheritance),继承和多态度、封装一起构成面向对象程序设计的三大要素,继承指一个类基于一个已有的类按照需求添加和删除一些功能.

首先,我们通过下面一个例子来了解一下virtual 和override关键字的作用.

class CA
{

public void Foo()
    {

Console.WriteLine("CA.Foo");

}

}

class CB : CA
{

public  void Foo()
    {

Console.WriteLine("CB.Foo");

}

}

class Test
{

public static void InvokeFoo(CA ca)
    {

ca.Foo();

}

public static void Main()
    {

InvokeFoo(new CB());

}

}

我们先试着猜想一下输出的结果应该为什么,从逻辑上说作者想要得到的应该是输出:CB.Foo.但我们执行一次很容易的发现结果是CA.Foo.这是怎么回事呢.我们的CB类不是已经继承了CA类吗,而我们的InvokeFoo方法不是也已经创建了一个新的CB对象吗?怎么最后的结果却是CA.Foo.

因为在调用InvokeFoo()的时候,CB被转换成CA,所以执行ca.Foo的时候,仍然调用的是CA的Foo。

那怎样才能让这段代码按作者的意图输出CB.Foo了?我们再来看看下面的这段代码,注意它与上面代码的不同之处:

class CA
{

public virtual void Foo()
    {

Console.WriteLine("CA.Foo");

}

}

class CB : CA
{

public override void Foo()
    {

Console.WriteLine("CB.Foo");

}

}

class Test
{

public static void InvokeFoo(CA ca)
    {

ca.Foo();

}

public static void Main()
    {

InvokeFoo(new CB());

}

}

输出结果:CB.Foo

可能大家已经注意到了,我们在基类CA的Foo()方法前使用了virtual关键字体,在子类CB的Foo()方法前使用了override关键字.恰恰就是这两个关键字帮助我们实现了我们的想法.那他们究竟又做了些什么呢?原来virtual关键字告诉编译器,当前Foo()方法需要运行时才进行绑定,而override关键字告诉编译器它后面的Foo()方法将要覆盖基类中的Foo()方法.因此尽管在调用InvokeFoo()的时候,CB被转换成CA,但是当执行ca.Foo的时候,仍然调用了CB的Foo。因为ca此时指向的是一个CB类型的对象

C#.NET 虚方法中中的virtual 和override关键字的使用相关推荐

  1. C#~虚方法,虚方法和抽象方法的区别

    虚方法 特点: <1>虚方法必须使用virtual修饰 <2>虚方法同抽象方法(adstract)一样使用override关键字重写 <3>虚方法在子类中可以实现, ...

  2. C#中虚方法(virtual)详解

    前言;在前面的博客重写中提到了虚方法和抽象类,本博文详细介绍下虚方法: 目录: 一.虚方法的定义: 二.虚方法的声明: 三.虚方法的调用: 四.虚方法的规则: 五.虚方法注意事项: 六.虚方法的好处: ...

  3. 虚方法调用在Java虚拟机中的实现方式?

    写在前面 本文隶属于专栏<100个问题搞定Java虚拟机>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定Java ...

  4. 关于C#中虚方法重载的说明

    < DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 首先请大家看看下面的例子 ...

  5. C# 虚方法(virtual)覆盖(override) - 隐藏(new) - 重载

    C# 虚方法(virtual)覆盖(override) - 隐藏(new) - 重载 using System; using System.Collections.Generic; using Sys ...

  6. @data 重写set方法_C#中的类、方法和属性

    这节讲C#中的类,方法,属性.这是面向对象编程中,我们最直接打交道的三个结构.    类: 类(class)是面向对象中最基本的单元,它是一种抽象,对现实世界中事物的抽象,在C#中使用class关键字 ...

  7. c#中abstract与virtual的区别

    1.abstract方法只能在抽象类中声明,虚方法则不是.    abstract方法必须在派生类中重写,而virtual则不必 2.abstract方法不能声明方法实体,       abstrac ...

  8. C#中Abstract和Virtual的区别

    转自原文 C#中Abstract和Virtual的区别 c# 中 Abstract和Virtual比较容易混淆,都与继承有关,并且涉及override的使用.下面讨论一下二者的区别: 一.Virtua ...

  9. C# 子类实例化基类 基类使用不了子类的方法_C#中的类、方法和属性

    这节讲C#中的类,方法,属性.这是面向对象编程中,我们最直接打交道的三个结构.    类: 类(class)是面向对象中最基本的单元,它是一种抽象,对现实世界中事物的抽象,在C#中使用class关键字 ...

最新文章

  1. kvm cpu的亲和性绑定配置
  2. 解析网站发布系统利用ASP生成静态页面的方法
  3. 差分约束 1:pku 1201 Intervals 2:pku 1364 King 3:hdu 1534
  4. 分布式事务:两段式提交(最终一致性)
  5. 当分区数量与reducer task数量不一致时,会怎么样。
  6. 1097 Deduplication on a Linked List (25 分)_35行代码AC
  7. WIN7部分程序中文乱码的简单解决方法
  8. 全球约39亿人未接入互联网 韩国家庭宽带普及率最高
  9. 博弈-巴什博奕-P/N图
  10. csv解析java_Java CSV解析器
  11. linux的文件permission需要设置,否则会使用as3的urlrequest失败
  12. 【WIN10】清除图标缓存
  13. 面试题:Elasticsearch和solr的区别
  14. 关于安装VS2005后‘找不到visual studio模板信息’的解决方法
  15. android 计时器工具类,Android实现计时器功能
  16. Java 操作 word 文档 (二)初识 WordprocessingML 标签
  17. 在Vue项目中使用LayUI教程且解决laydate无效的问题
  18. Centos7下areaDetector IOC的编译后记
  19. Leetcode 971 C++代码
  20. 虚继承是什么意思_程序猿是什么意思?程序员为什么叫程序猿?程序猿笑话段子-360常识网...

热门文章

  1. 增强记忆力的10种小妙招,超有效!
  2. 第一卷清晨的帝国第一百四十七章希望在人间
  3. JS截取名字字符串的后面2位
  4. 俞敏洪:对待生命的态度
  5. 无聊中~~看《失恋33天》,单片循环
  6. [ZT ]寓言小故事折射HR管理大道理
  7. 电脑开机计算机打开盘慢,电脑开机太慢了?教你4个方法,轻松加快Windows启动速度!...
  8. Oracle 数据库的聚簇技术
  9. hbase:汇总知识
  10. Evil Coordinate亚洲区域赛(南京)