虛函數 純虛函數 抽象類


虛函數

  定義:在某基類中聲明為 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();
            }
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM