虚函数 纯虚函数 抽象类
虚函数
定义:在某基类中声明为 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(); } } } }