C#中虚方法virtual示例详解

 更新时间:2025年03月31日 11:13:37   作者:木偶  
这篇文章主要介绍了C#中虚方法virtual的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

前言;在前面的博客重写中提到了虚方法和抽象类,本博文详细介绍下虚方法:

一.虚方法的定义:

当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法,虚方法是使用关键字virtual声明的,虚方法可以在不同的继承类中有不同的实现,即为基类中定义的允许在派生类中重写的方法;

二.虚方法的声明:

一般的声明形式如下:

访问修饰符 virtual 函数返回类型 函数名(参数表) {函数体};

举例:

 class Person
    {
        public virtual void XXX()
        {
            Console.WriteLine("我有一个梦想,那就是动身去往远方!!");
        }
    }

三.虚方法的调用:

调用上,使用子类构造的对象调用虚方法,就会调用子类的方法,使用父类构造的对象,就会调用父类的方法;(在规则 4 中有举例说明)
1.在基类中声明的虚方法一般在派生类中对其进行调用,会运用到base关键字:
当输入访问修饰符和override后,系统会自己弹出我们刚才编写的虚方法,直接进行选择即可:

2.在运行时进行调用:

四.虚方法的规则:

1. 虚拟类其实指的是正常类中的虚拟方法,所以虚拟类可以直接使用实例,这是与抽象类不同的一点;
它不会像抽象类一样进行报错!!!

2. 虚拟方法是在方法前加virtual关键字,对方法进行声明,说明这个方法为虚方法;

 class Person
    {
        public virtual void XXX()//虚方法
        {
            Console.WriteLine("我有一个梦想,那就是动身去往远方!!");
        }
    }
     class Boy : Person//继承person
    {
        public override void XXX()//虚方法调用
        {
            base.XXX();
        }
    }

3. 虚拟函数和正常函数无区别;
4. 子类继承虚拟类可以实现虚拟方法也可以不实现虚拟方法;
如下代码所示,在调用虚方法时,对虚方法进行了重写,这样代码执行下来的就是子类的方法而不是父类的虚方法:::

 class Person
    {
        public virtual void XXX()
        {
            Console.WriteLine("我有一个梦想,那就是动身去往远方!!");
        }
     }
     class Boy : Person
    {
        public override void XXX()
        {
            Console.WriteLine("我不想继承父类的虚方法");
        }
         public void SSS()
        {
            Console.WriteLine("不学习就不会进步,不仅不就没有出人头地的机会");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person();//实例化的虚方法类
            Boy boy = new Boy();//实例化的子类
            boy.XXX();//调用了子类的方法
            boy.SSS();
            Console.ReadLine();
        }
    }

结果如图所示:

但是如果我们采用base关键字进行调用的话就会有以下的结果:

 public override void XXX()
        {
            base.XXX();
           // Console.WriteLine("我不想继承父类的虚方法");
        }

结果如下:它调用了父类/基类的虚方法

5. 虚方法可以在不同的继承类中有不同的实现;
我们在以上案例中继续进行添加调用虚方法:

 class DD : Person 
    {
        public override void XXX()
        {
            base.XXX();
            Console.WriteLine("我是第一个继承虚方法的");
        }
    }
    class SS : Person
    {
        public override void XXX()
        {
            base.XXX();
            Console.WriteLine("我是第二个继承虚方法的");
        }
    }

当然别忘记实例化哦,我在这儿就不写实例化的代码了,但是千万不能忘记哦!!😃
运行结果:

五.虚方法注意事项:

  • 一定要注意,只有为虚方法时可以进行重写,不能对非虚方法进行重写;

  • 虚方法在形式上在方法名前加virtual修饰;
  • 虚方法一般在基类定义,在派生类中实现具体操作,派生类实现该方法时,要用override对其方法进行修饰;
  • 当用virtual修饰后,不允许再有 staticabstract 或者 override 修饰符;

六.虚方法的好处:

当在基类中进行虚方法的定义以后,在派生类中可以对其方法进行调用,而且可以通过重写来改变其中实现的功能来实现自己的一些功能,而不是虚方法时,必须重新声明方法然后再进行自己想要的功能进行编写然后再进行调用,但是虚方法只需要在派生类中对其进行调用,如果想实现其他的功能可以对其进行方法等的重写,进而实现自己想要的功能,调用基类的虚方法来执行派生类的具体操作。而在基类调用时,并不需要知道派生类是怎么样实现的。因为不同的派生类可能实现的方式不一样。但调用的方式是一样的,实现了不同的功能

七.虚方法的作用:

1.允许 子类 / 派生类 进行重写;
2.增加代码的可维护性,脉络较清淅有条理;

到此这篇关于C#中虚方法virtual详解的文章就介绍到这了,更多相关C# 虚方法virtual内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在C#中List集合使用First()方法获取第一个元素的操作

    在C#中List集合使用First()方法获取第一个元素的操作

    这篇文章主要介绍了在C#中List集合使用First()方法获取第一个元素的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C#从XmlDocument提取完整字符串的方法

    C#从XmlDocument提取完整字符串的方法

    文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,方法二利用`XmlWriterSettings`控制格式,并通过`MemoryStream`作为输出流,可以自定义编码,如UTF-8,感兴趣的朋友跟随小编一起看看吧
    2025-02-02
  • C#无损转换Image为Icon的方法

    C#无损转换Image为Icon的方法

    这篇文章主要为大家详细介绍了C#无损转换Image为Icon的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • c#连接mysql数据库的方法

    c#连接mysql数据库的方法

    这篇文章主要介绍了c#连接mysql数据库的方法,需要的朋友可以参考下
    2014-04-04
  • 使用C#操作ftp服务器的示例代码

    使用C#操作ftp服务器的示例代码

    这篇文章主要为大家详细介绍了使用C#操作ftp服务器的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考下
    2024-02-02
  • C#串口通信模块使用方法示例

    C#串口通信模块使用方法示例

    这篇文章主要介绍了C#串口通信模块使用方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • DOTNETBAR制作圆角窗体和圆角控件代码实例

    DOTNETBAR制作圆角窗体和圆角控件代码实例

    这篇文章主要介绍了DOTNETBAR制作圆角窗体和圆角控件的方法,大家参考使用吧
    2013-11-11
  • C#实现拼手气红包算法

    C#实现拼手气红包算法

    这篇文章主要为大家详细介绍了C#实现拼手气红包算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • C#在LINQ中使用GroupBy

    C#在LINQ中使用GroupBy

    这篇文章主要介绍了C#在LINQ中如何使用GroupBy,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-08-08
  • 基于C#实现视频文件解封装与媒体流读取方案

    基于C#实现视频文件解封装与媒体流读取方案

    本文详细介绍了基于C#实现视频文件解封装与媒体流读取的两种方案:FFmpeg.AutoGen和FFmpeg.NET,对比了两种库的优缺点,并分别提供了实现方案,包括环境配置、核心代码和高级功能,还讨论了解封装流程、媒体流读取方法、性能优化和调试技巧,需要的朋友可以参考下
    2026-02-02

最新评论