虚函数 纯虚函数 抽象类

虚函数

  定义:在某基类中声明为 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();
            }
        }
    }
}

 

posted @ 2012-11-27 16:57  streetpasser  阅读(3059)  评论(0编辑  收藏  举报