C#中虚方法(virtual)详解

C#中虚方法(virtual)详解虚方法如何定义?虚方法怎么声明?虚方法的规则是什么?虚方法如何进行调用?虚方法的作用是什么?虚方法有什么好处?虚方法使用时注意什么?

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

一.虚方法的定义:

当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法,虚方法是使用关键字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("我是第二个继承虚方法的");
        }
    }

当然别忘记实例化哦,我在这儿就不写实例化的代码了,但是千万不能忘记哦!!?
运行结果:
在这里插入图片描述

五.虚方法注意事项:

  1. 一定要注意,只有为虚方法时可以进行重写,不能对非虚方法进行重写;
    在这里插入图片描述
  2. 虚方法在形式上在方法名前加virtual修饰;
  3. 虚方法一般在基类定义,在派生类中实现具体操作,派生类实现该方法时,要用override对其方法进行修饰;
  4. 当用virtual修饰后,不允许再有 staticabstract 或者 override 修饰符;

六.虚方法的好处:

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

七.虚方法的作用:

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197537.html原文链接:https://javaforall.net

(0)
上一篇 2025年9月1日 下午10:43
下一篇 2025年9月1日 下午11:22


相关推荐

  • sql注入 报错注入_sql原理

    sql注入 报错注入_sql原理sql注入报错注入原理详解前言我相信很多小伙伴在玩sql注入报错注入时都会有一个疑问,为什么这么写就会报错?曾经我去查询的时候,也没有找到满意的答案,时隔几个月终于找到搞清楚原理,特此记录,也希望后来的小伙伴能够少走弯路0x01我们先来看一看现象,我这里有一个users表,里面有五条数据:然后用我们的报错语句查询一下:selectcount(*…

    2022年9月30日
    6
  • 3D打印S3d参数设置

    3D打印S3d参数设置挤出机层附加填充温度冷却脚本开始脚本 G28 homeallaxes 结束脚本 M104S0 extruderheat relativeposi 1F300 retractthefi 0 5E 5X 20Y 20F8700 moveZupa

    2026年3月26日
    2
  • C# -XML用法(XmlDocument )

    C# -XML用法(XmlDocument )使用visualstudio中自带的xml解析器,引入System.Xml命名空间。1.向文件中写入配置xml文件实现效果:<?xmlversion="1.0"encoding="utf-8"?><某某某某公司><执行董事兼总经理>曾振帅</执行董事兼总经

    2022年6月19日
    68
  • Scrapy 2.6 Spider Middleware 爬虫页中间件使用指南

    Scrapy 2.6 Spider Middleware 爬虫页中间件使用指南Python3 的 Scrapy 爬虫框架中数据爬取过程中 Spider 中间件 是 Scrapy 的 Spider 处理机制的一个挂钩框架 用于在其中插入自定义功能 将发送到 Spider 的响应进行处理以及处理从 Spider 生成的请求和项目 Spider 中间件组件 SPIDERMIDDLE 为字典格式 其键为中间件类路径 其值为中间件顺序 下载器中间件组件 SPIDERMIDDLE 为字典格式 其键为中间件类路径 其值为中间件顺序 在项目的 settings py 中是禁用状

    2026年3月19日
    2
  • 中国移动apn接入点选哪个网速快(中国移动数据接入点怎么设置)

    中国移动有cmwap,cmnet和LTE三种网络接入点。这三个网络接入点的特点各有不同。其中LTE就是指4G,网络速度相较其他两种接入点速度更快,流量损耗速度也更快。具体介绍如下:1、CMNET可以获得完全的Internet访问权。我们通过CMWAP只能访问WAP网站。CMWAP使用HTTP代理协议和WAP网关协议可以访问到Internet。CMNET则适用于所有协议,它也是标准的TCP/IP协议…

    2022年4月12日
    509
  • (2021 最新版)IntelliJ IDEA 下载安装及配置教程

    (2021 最新版)IntelliJ IDEA 下载安装及配置教程前言因为自己电脑最近实在是太卡了,也一直提示更新,索性就直接重装了个系统。因为需要重装下IDEA,而现在新版本的IDEA和之前的版本还是有很大变化的,所以在这里写一篇博客做个记录,方便自己后续配置,也顺便分享给大家。准备工作既然要安装IDEA,那么首先需要前往JetBrains的官网下载最新版的IDEA,下载地址如下:https://www.jetbrains.com/idea/download/这里最新的版本是2021.1.2,而因为我有旗舰版的账号,所以这里就以旗舰版安装

    2022年5月20日
    919

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号