C#虚函数使用方法与多态实例解析
C#虚函数是实现面向对象编程中多态性的核心机制之一。本文将详细解释如何通过在基类中使用 virtual 关键字声明虚函数,并在派生类中使用 override 关键字进行重写,从而根据对象实际类型调用相应的方法实现。
虚函数与多态的概念
在C#中,默认情况下方法是非虚的,这意味着即使派生类定义了与基类相同签名的方法,如果通过基类引用调用该方法,执行的是基类的实现(这被称为“隐藏”而非“重写”)。
为了实现多态(Polymorphism),我们需要:
- 基类声明:使用
virtual修饰符标记方法为虚函数。 - 派生类实现:使用
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#多态实现与面向对象设计的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













