一、基本介绍
虚函数(Virtual Function)和重写(Override)是面向对象编程中多态性(Polymorphism)的实现方式之一。它们允许子类改变从基类继承来的行为。
虚函数(Virtual Function)
- 虚函数是基类中用
virtual
关键字声明的方法。 - 虚函数可以被子类重写,以提供不同的实现。
- 虚函数的调用是在运行时(Runtime)决定的,这称为动态绑定(Dynamic Binding)。
重写(Override)
- 当子类想要改变继承自基类的虚函数的行为时,可以使用
override
关键字来重写该方法。 - 重写的方法必须与基类中的虚函数签名完全匹配。
- 重写的方法提供了一个特定的实现,这个实现会覆盖基类中的虚函数。
二、示例代码
下面是一个简单的示例,展示了如何在C#中使用虚函数和重写:
// 定义一个基类
public class Animal
{// 虚函数public virtual void MakeSound(){Console.WriteLine("Some generic sound");}
}// 继承基类的子类
public class Dog : Animal
{// 重写基类中的虚函数public override void MakeSound(){Console.WriteLine("Woof!");}
}// 继承基类的另一个子类
public class Cat : Animal
{// 重写基类中的虚函数public override void MakeSound(){Console.WriteLine("Meow!");}
}public class Program
{public static void Main(){// 创建子类的实例Dog dog = new Dog();Cat cat = new Cat();// 调用方法dog.MakeSound(); // 输出: Woof!cat.MakeSound(); // 输出: Meow!// 使用基类引用调用子类的方法Animal myAnimal = new Dog();myAnimal.MakeSound(); // 输出: Woof!myAnimal = new Cat();myAnimal.MakeSound(); // 输出: Meow!}
}
在这个例子中,Animal
类有一个虚函数 MakeSound()
。Dog
和 Cat
类重写了这个虚函数,提供了它们自己的实现。在 Main
方法中,即使我们使用 Animal
类型的引用来调用 MakeSound()
方法,实际调用的是 Dog
或 Cat
类的重写版本,这就是多态性的体现。
三、注意事项
虚方法和重写的注意事项
- 虚函数可以没有
virtual
关键字,但如果没有virtual
或override
关键字,那么它将不会表现出多态性,而是静态绑定(Static Binding)。 - 虚函数和重写的方法签名必须完全相同,包括方法名、参数列表和返回类型。
- 重写的方法不能比基类的虚函数的访问级别更严格。例如,如果基类中的虚函数是
public
,那么重写的方法也必须是public
或更宽松的访问级别。 - 可以使用
sealed
关键字阻止进一步重写虚函数。