虚函数 纯虚函数 抽象类
虚函数
定义:在某基类中声明为 virtual, 并在一个或多个派生类中被重新定义的成员函数
子类继承了父类的一个函数(方法),而我们把父类的指针指向子类,则必须把父类的该函数(方法)设为virtual(虚函数)
语法:virtual 函数返回类型 函数名(参数表) { 函数体 }
用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数
虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的一般形式
在定义了虚函数后,派生类继承虚函数的接口,由于虚函数还提供了实现,派生类可以选择改写(override)它们或不改写它们。
但基类与派生类的参数个数与类型要一致。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。
纯虚函数
定义: 如果父类的函数(方法)根本没有必要或者无法实现,完全要依赖子类去实现的话,可以把此函数(方法)设为 virtual 函数名=0 我们把这样的函数(方法)称为纯虚函数。
特征: 纯虚函数必须在继承类中重新声明函数(不要后面的=0,否则该派生类也不能实例化),而且它们在抽象类中往往没有定义。
目的: 定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。
非虚函数
当一个成员函数为非虚函数时,不管它的派生类有多特殊, 非虚函数的行为都是不变的.
声明非虚函数的目的在于,使派生类继承函数的接口和强制性实现。(所有的派生类都应该使用该非虚函数完成某一个功能)
抽象类
* 如果一个类包含了纯虚函数,称此类为抽象类
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
public class Animal
{
public virtual void Eat()
{
Console.WriteLine("I eat like a generic Animal.");
}
}
public class Wolf : Animal
{
public override void Eat()
{
Console.WriteLine("I eat like a wolf!");
}
}
public class Fish : Animal
{
public override void Eat()
{
Console.WriteLine("I eat like a fish!");
}
}
public class GoldFish : Fish
{
public override void Eat()
{
Console.WriteLine("I eat like a goldfish!");
}
}
public class OtherAnimal : Animal
{
// Eat() method is not overridden, so the base class method will be used.
}
public class Program
{
public static void Main(string[] args)
{
IList<Animal> animals = new List<Animal>();
animals.Add(new Animal());
animals.Add(new Wolf());
animals.Add(new Fish());
animals.Add(new GoldFish());
animals.Add(new OtherAnimal());
foreach (Animal currentAnimal in animals)
{
currentAnimal.Eat();
}
}
}
}
浙公网安备 33010602011771号