iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >C#中虚方法virtual的示例分析
  • 401
分享到

C#中虚方法virtual的示例分析

2023-06-14 12:06:51 401人浏览 泡泡鱼
摘要

这篇文章给大家分享的是有关C#中虚方法virtual的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在c++、Java等众多OOP语言里都可以看到virtual的身影,而C#作为一个完全面向对象的语言当然

这篇文章给大家分享的是有关C#中虚方法virtual的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

c++、Java等众多OOP语言里都可以看到virtual的身影,而C#作为一个完全面向对象的语言当然也不例外。

虚拟函数从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢?一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死了的!而虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象实例来动态判断要调用的函数,其中那个申明时定义的类叫申明类,那个执行时实例化的类叫实例类。

如:飞禽 bird = new 麻雀();
那么飞禽就是申明类,麻雀是实例类。

具体的检查的流程如下:

当调用一个对象的函数时,系统会直接去检查这个对象申明定义的类,即申明类,看所调用的函数是否为虚函数;

如果不是虚函数,那么它就直接执行该函数。而如果有virtual关键字,也就是一个虚函数,那么这个时候它就不会立刻执行该函数了,而是转去检查对象的实例类。

在这个实例类里,他会检查这个实例类的定义中是否有重新实现该虚函数(通过override关键字),如果是有,那么OK,它就不会再找了,而马上执行该实例类中的这个重新实现的函数。而如果没有的话,系统就会不停地往上找实例类的父类,并对父类重复刚才在实例类里的检查,直到找到第一个重载了该虚函数的父类为止,然后执行该父类里重载后的函数。

知道这点,就可以理解下面代码的运行结果了:

using System;namespace VirtualMethodTest{    class A    {        public virtual void Func() // 注意virtual,表明这是一个虚拟函数        {            Console.WriteLine("Func In A");        }    }    class B : A // 注意B是从A类继承,所以A是父类,B是子类    {        public override void Func() // 注意override ,表明重新实现了虚函数        {            Console.WriteLine("Func In B");        }    }    class C : B // 注意C是从A类继承,所以B是父类,C是子类    {    }    class D : A // 注意B是从A类继承,所以A是父类,D是子类    {        public new void Func() // 注意new ,表明覆盖父类里的同名类,而不是重新实现        {            Console.WriteLine("Func In D");        }    }    class program    {        static void Main()        {            A a;         // 定义一个a这个A类的对象.这个A就是a的申明类            A b;         // 定义一个b这个A类的对象.这个A就是b的申明类            A c;         // 定义一个c这个A类的对象.这个A就是b的申明类            A d;         // 定义一个d这个A类的对象.这个A就是b的申明类            a = new A(); // 实例化a对象,A是a的实例类            b = new B(); // 实例化b对象,B是b的实例类            c = new C(); // 实例化b对象,C是b的实例类            d = new D(); // 实例化b对象,D是b的实例类            a.Func();    // 执行a.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类A,就为本身 4.执行实例类A中的方法 5.输出结果 Func In A            b.Func();    // 执行b.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类B,有重载的 4.执行实例类B中的方法 5.输出结果 Func In B            c.Func();    // 执行c.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类C,无重载的 4.转去检查类C的父类B,有重载的 5.执行父类B中的Func方法 5.输出结果 Func In B            d.Func();    // 执行d.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类D,无重载的(这个地方要注意了,虽然D里有实现Func(),但没有使用override关键字,所以不会被认为是重载) 4.转去检查类D的父类A,就为本身 5.执行父类A中的Func方法 5.输出结果 Func In A            D d1 = new D();            d1.Func(); // 执行D类里的Func(),输出结果 Func In D            Console.ReadLine();        }    }}

感谢各位的阅读!关于“C#中虚方法virtual的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: C#中虚方法virtual的示例分析

本文链接: https://www.lsjlt.com/news/270924.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#中虚方法virtual的示例分析
    这篇文章给大家分享的是有关C#中虚方法virtual的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在C++、Java等众多OOP语言里都可以看到virtual的身影,而C#作为一个完全面向对象的语言当然...
    99+
    2023-06-14
  • React中的Virtual DOM示例分析
    本篇内容主要讲解“React中的Virtual DOM示例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React中的Virtual DOM示例分析”吧!这是Choero...
    99+
    2023-06-29
  • 详解C# 虚方法virtual
    在C++、Java等众多OOP语言里都可以看到virtual的身影,而C#作为一个完全面向对象的语言当然也不例外。 虚拟函数从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢...
    99+
    2024-04-02
  • C#中Convert类解决方法的示例分析
    这篇文章主要介绍了C#中Convert类解决方法的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。你有一个包含二进制数、八进制数、十进制数或十六进制数的字符串。你需要把...
    99+
    2023-06-18
  • C#中的虚函数virtual
    一、简介 虚拟函数从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢?一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死了的!而虚...
    99+
    2024-04-02
  • Java中方法的示例分析
    这篇文章给大家分享的是有关Java中方法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是方法例如:System.out.println();其结构为-->类.对象.方法;其含义为-->调...
    99+
    2023-06-20
  • vue中Virtual Dom实现snabbdom解密的示例分析
    这篇文章给大家分享的是有关vue中Virtual Dom实现snabbdom解密的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vue在官方文档中提到与react的渲染性...
    99+
    2024-04-02
  • CSS3中calc()方法的示例分析
    这篇文章给大家分享的是有关CSS3中calc()方法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下面一段代码给大家介绍css3中的calc()方法,具体内容如下所示:<div styl...
    99+
    2023-06-08
  • PHP中mysqli_affected_rows()方法的示例分析
    这篇文章主要介绍了PHP中mysqli_affected_rows()方法的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php有什么特点1、执行速度快。2、具有很好...
    99+
    2023-06-14
  • JavaScript中return方法的示例分析
    小编给大家分享一下JavaScript中return方法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在js中,return方法是将终止当前函数并返回当...
    99+
    2023-06-15
  • PHP中的prepare()方法的示例分析
    这篇文章主要介绍了PHP中的prepare()方法的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php是什么语言php,一个嵌套的缩写名称,是英文超级文本预处理语言...
    99+
    2023-06-14
  • vue中虚拟DOM的示例分析
    这篇文章主要介绍了vue中虚拟DOM的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。虚拟 DOM 优点:保证性能下限:&n...
    99+
    2024-04-02
  • JavaScript方法的示例分析
    小编给大家分享一下JavaScript方法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在一个对象中绑定函数,称为这个...
    99+
    2024-04-02
  • python中断言方法的示例分析
    这篇文章主要为大家展示了“python中断言方法的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中断言方法的示例分析”这篇文章吧。pytho...
    99+
    2024-04-02
  • php中魔术方法的示例分析
    这篇文章给大家分享的是有关php中魔术方法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php魔术方法:1、【_sleep()】控制对象序列化时真正处理的部分;2、【_wakeup()】在反序列化后还原...
    99+
    2023-06-14
  • c++中异常的示例分析
    这篇文章主要介绍了c++中异常的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、什么是异常处理一句话:异常处理就是处理程序中的错误。二、为什么需要异常处理,异常处理...
    99+
    2023-06-15
  • C#中指针的示例分析
    这篇文章将为大家详细讲解有关C#中指针的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、简洁优美的代码本来初稿这节写了好几百字,将C#指针开发与C/C++开发,Java开发、D语言开发等进行对比...
    99+
    2023-06-20
  • C#中Abstract方法和Virtual方法的区别
    简介: c#中Abstract和Virtual比较容易混淆,都与继承有关,并且涉及override的使用。virtual可以被子类重写,而abstract必须被子类重写。virtua...
    99+
    2024-04-02
  • C++中多态的示例分析
    小编给大家分享一下C++中多态的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. 多态概念1.1 概念多态的概念:通俗来说,就是多种形态,具体点就是去完...
    99+
    2023-06-15
  • C++继承方式的示例分析
    这篇文章给大家介绍C++继承方式的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C++支持多种程序设计风格,其中就包括对面向对象设计的支持。我们今天在这里将会为大家详细介绍一下各种C++继承方式的具体应用方法,...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作