C#虚函数使用方法与多态实例解析

追风的人
追风的人
发布时间:2026-10-13| 3人浏览过
原创

C#虚函数是实现面向对象编程中多态性的核心机制之一。本文将详细解释如何通过在基类中使用 virtual 关键字声明虚函数,并在派生类中使用 override 关键字进行重写,从而根据对象实际类型调用相应的方法实现。

虚函数与多态的概念

在C#中,默认情况下方法是非虚的,这意味着即使派生类定义了与基类相同签名的方法,如果通过基类引用调用该方法,执行的是基类的实现(这被称为“隐藏”而非“重写”)。

为了实现多态(Polymorphism),我们需要:

  1. 基类声明:使用 virtual 修饰符标记方法为虚函数。
  2. 派生类实现:使用 override 修饰符提供该虚函数的具体实现。

这样,当基类引用指向派生类对象时,程序会在运行时动态决定调用哪个版本的方法。

操作示例:飞机速度计算

下面是一个典型的C#控制台应用程序示例,展示了普通方法(隐藏)与虚函数(重写)的区别。

第1步:构建基类与派生类结构

我们定义一个 Plane(飞机)基类和一个 Jet(喷气式飞机)派生类。注意,在提供的原始示例中,子类使用了同名方法但未加 override,这实际上构成了成员隐藏(Member Hiding)。为了演示真正的虚函数用法,我们需要修正代码,显式添加 virtual 和 override。

using System;

namespace Test2 {
    // 基类:声明 TopSpeed 为 virtual
    class Plane {
        public virtual double TopSpeed() {
            return 300.0D; // 普通飞机的速度
        }
    }

    // 派生类:使用 override 重写 TopSpeed
    class Jet : Plane {
        public override double TopSpeed() {
            return 900.0D; // 喷气式飞机的速度
        }
    }

    // 测试入口
    class Airport {
        static void Main(string[] args) {
            // 创建对象,但用基类引用指向它
            Plane plane = new Jet();
            
            // 由于 TopSpeed 是 virtual 且被 override
            // 此处调用的是 Jet 类的 TopSpeed()
            Console.WriteLine("planes top speed: {0}", plane.TopSpeed());
            
            // 保持控制台开启
            Console.ReadLine();
        }
    }
}

第2步:编译与运行

将上述代码保存为 Program.cs 或嵌入到项目中,使用 dotnet CLI 或 Visual Studio 进行编译运行。

预期输出:

planes top speed: 900

尽管变量 plane 的类型是 Plane,但其实际实例是 Jet。因为 TopSpeed 被定义为虚函数并被重写,CLR(公共语言运行时)在运行时识别出实际对象的类型,并调用了 Jet 类中的方法,返回了 900.0D。

关键注意事项

  • 匹配签名:override 方法的访问级别(如 public)、名称、参数列表必须与 virtual 方法完全一致。
  • 不可变规则:静态方法、非虚方法或非密封类中的属性等不能成为虚函数。
  • base关键字:在子类的 override 方法内部,可以使用 base.TopSpeed() 来调用基类的原始实现,常用于扩展而非完全替换逻辑。

原文修正说明

原始的草稿示例中,Jet 类直接定义了 public double TopSpeed() 而没有使用 override 关键字,同时在基类中也未使用 virtual。这种写法会导致编译器提示警告("New modifier required because the inherited member is not virtual"),并且在通过基类引用调用时只会得到基类的值(300.0D),无法体现多态性。上文已将其修正为标准的多态实现方式。

总结

掌握 virtual 和 override 是理解C#面向对象设计的关键。它们允许代码在不关心具体子类型的情况下,以统一的方式处理不同行为,极大地提高了代码的扩展性和维护性。

以上就是C#虚函数用法的详细内容,更多关于C#多态实现与面向对象设计的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。