当前位置:首页 > 工具 > 正文内容

虚方法解析与应用

访客 工具 2026年6月18日 1

虚方法概述

当一个实例方法前使用 virtual 关键字修饰时,该方法即为虚方法。虚方法的核心特性在于其可以在派生类中被重写,从而实现多态行为。

虚方法的特点

  • 虚方法不能同时使用 staticabstractoverride 修饰符。
  • 虚方法不能是私有的(private),因此不能使用 private 修饰符。

虚方法的执行机制

普通方法在编译时会直接绑定到具体实现,而虚方法的调用则依赖运行时的对象类型动态决定。以下是虚方法执行的基本流程:

  1. 系统首先检查调用对象的声明类型(即声明类)以确定方法是否为虚方法。
  2. 如果方法不是虚方法,则直接执行;如果是虚方法,则进一步检查对象的实际类型(即实例类)。
  3. 在实例类中查找是否存在对该虚方法的重写(通过 override 关键字)。若存在,则执行实例类中的实现;否则沿继承链向上查找,直到找到第一个重写的实现。

代码示例

示例1:简单虚方法调用


class BaseClass
{
    public virtual void Display()
    {
        Console.WriteLine("This is from BaseClass.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        BaseClass obj = new BaseClass();
        obj.Display(); // 输出: This is from BaseClass.
        Console.ReadLine();
    }
}

示例2:派生类重写虚方法


class BaseClass
{
    public virtual void Display()
    {
        Console.WriteLine("This is from BaseClass.");
    }
}

class DerivedClass : BaseClass
{
    public override void Display()
    {
        Console.WriteLine("This is from DerivedClass.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        BaseClass obj = new DerivedClass();
        obj.Display(); // 输出: This is from DerivedClass.
        Console.ReadLine();
    }
}

示例3:未重写的间接派生类


class BaseClass
{
    public virtual void Display()
    {
        Console.WriteLine("This is from BaseClass.");
    }
}

class IntermediateClass : BaseClass
{
    public override void Display()
    {
        Console.WriteLine("This is from IntermediateClass.");
    }
}

class FinalClass : IntermediateClass { }

class Program
{
    static void Main(string[] args)
    {
        BaseClass obj = new FinalClass();
        obj.Display(); // 输出: This is from IntermediateClass.
        Console.ReadLine();
    }
}

示例4:隐藏与重写的区别


class BaseClass
{
    public virtual void Display()
    {
        Console.WriteLine("BaseClass Display.");
    }
}

class DerivedClass : BaseClass
{
    public new void Display()
    {
        Console.WriteLine("DerivedClass Display.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        BaseClass obj = new DerivedClass();
        obj.Display(); // 输出: BaseClass Display.

        DerivedClass derivedObj = new DerivedClass();
        derivedObj.Display(); // 输出: DerivedClass Display.
        Console.ReadLine();
    }
}

抽象函数与密封类

抽象类可以重写基类中的虚方法,并且可以选择将其定义为抽象方法。例如:


abstract class BaseClass
{
    public virtual void Show()
    {
        Console.WriteLine("BaseClass.Show()");
    }
}

abstract class AbstractDerived : BaseClass
{
    public abstract override void Show();
}

密封类虽然不能被继承,但仍可包含从基类继承的虚方法。这些方法在密封类中将自动变为非虚方法:


class BaseClass
{
    public virtual void Execute()
    {
        Console.WriteLine("BaseClass.Execute()");
    }
}

sealed class SealedClass : BaseClass
{
    public override void Execute()
    {
        Console.WriteLine("SealedClass.Execute()");
    }
}

class Program
{
    static void Main(string[] args)
    {
        SealedClass obj = new SealedClass();
        obj.Execute(); // 输出: SealedClass.Execute()
        Console.ReadLine();
    }
}
标签: C#

相关文章

Trojan服务器搭建与配置

一、整体架构(先对齐认知)Clash Meta (PC / iOS / Android)        ↓ TLS   Trojan Server (443)        ↓     InternetTrojan 的核心是: TLS + HTTPS 流量伪装 看起来像正常网站 非常适合...

Tailscale 的详细用法

Tailscale 是一种基于 WireGuard 协议 的 零配置 VPN(虚拟私有网络)服务,让设备之间能够 安全、加密地直接连接,就像它们在同一个本地网络一样。它的核心特点是 简单、安全、跨平台。Tailscale 非常适合 没有公网 IP、两台电脑不在同一局域网 的场景。 简单来说,Tailscale 是什么?Tailscale 是一款让你的各种设备(电脑、服务器、手机...

Clash Tun 模式 导致 爱快(iKuai SD-Wan)内网域名无法访问

一、Clash  DNS 配置dns:  enable: true  listen: 0.0.0.0:53  ipv6: true  enhanced-mode: redir-host  nameserver:    - 223.5.5.5    - 223.6.6.6iKuai 内网域名 ...

深入解析Node.js运行环境与异步I/O架构

深入解析Node.js运行环境与异步I/O架构

核心定义与价值Node.js本质上是一个JavaScript运行环境,而非编程语言或应用框架。它赋予了JavaScript脱离浏览器在服务端、命令行工具及网络应用中执行的能力。其核心意义在于:用单一语言打通前后端开发壁垒。基于事件驱动与非阻塞I/O的架构特性,Node.js在处理API网关、实时通信及微服务等I/O密集型场景时表现卓越,已成为现代后端工程的主流选择。浏览器沙箱限制1995年Java...

ADO.NET SQL参数化查询的最佳实践

在 ADO.NET 中执行 SQL 查询时,参数化查询是一种关键的安全措施和性能优化手段。它通过将 SQL 命令和用户提供的数据分开处理,有效防止了 SQL 注入攻击,并有助于数据库缓存执行计划。下面总结了几种常用的参数化查询方式。 1. 使用 SqlParameter 对象(推荐) 这是最推荐的参数化查询方式。通过显式创建 SqlParameter 对象,您可以精确控制参数的类...

基于ELK的日志集中化分析系统搭建

构建统一日志管理平台的必要性 在分布式架构中,各服务节点独立运行,日志分散存储于不同主机。传统通过命令行工具如grep、awk逐个检索日志的方式,在数据量庞大时效率极低,难以实现快速定位问题。为提升运维效率,需建立集中式日志处理体系,具备日志采集、传输、存储、分析与告警能力。 ELK技术栈核心组件解析 Elasticsearch:分布式搜索引擎,支持全文检索、实时数据分析和高可用集群部署,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。