虚方法是在面向对象编程中的一个概念,是继承和多态性的基础,用来描述能够被子类重写(override)的方法。这使得在子类对象上调用这个方法时,实际执行的是子类中重写的方法。
虚方法的存在意味着在编译时无法确定应该调用哪个方法,而是在运行时根据对象的实际类型来确定。这种多态性的特性使得程序更加灵活和可扩展。
如何定义虚方法:
在C++中,通过在函数声明前加上virtual关键字来声明一个虚方法,在子类中可以使用override关键字来重写。
在C#和Java中,所有非静态的方法都默认是虚方法(隐式声明),也可以使用virtual关键字来显式声明虚方法(好处是增加代码的可读性和可维护性),在子类中可以使用override关键字来重写。
虚方法的定义和使用范例(C#):实现多态的过程
using System;
//定义父类Animal
class Animal
{
//用关键词virtual声明虚方法
public virtual void MakeSound()
{
Console.WriteLine("Animal makes a sound");
}
}
//定义子类Dog 继承父类 Animal
class Dog : Animal
{
//用关键词override 重写父类虚方法
public override void MakeSound()
{
Console.WriteLine("Dog barks");
}
}
//定义子类Cat 继承父类 Animal
class Cat : Animal
{
//用关键词override 重写父类虚方法
public override void MakeSound()
{
Console.WriteLine("Cat meows");
}
}
class Program
{
static void Main(string[] args)
{
Animal animal = new Animal(); //创建Animal对象
animal.MakeSound(); // 输出: "Animal makes a sound"
Animal dog = new Dog(); //创建Dog对象,执行Dog类中重写的方法
dog.MakeSound(); // 输出: "Dog barks"
Animal cat = new Cat(); //创建Cat对象,执行Cat类中重写的方法
cat.MakeSound(); // 输出: "Cat meows"
}
}
向上转型写法: Animal dog = new Dog();
将一个派生类的实例(Dog对象)赋值给一个基类的变量(Animal对象),这种写法可以将多个不同的子类对象统一当作基类处理,能够更通用地处理对象,也可以方便地扩展和使用多态性的特点。