[轉]overload-重載 override-覆蓋 overwrite-重寫或隱藏

轉自:http://blog.csdn.net/longhaobo11/archive/2005/12/15/553474.aspx
1.C++中三個概念
函數重載:
在C++程序中,可以將語義、功能相似的幾個函數用同一個名字表示,即函數重載。
重載的實現:
幾個同名的重載函數仍然是不同的函數,它們是如何區分的呢?我們自然想到函數
接口的兩個要素:參數與返回值。如果同名函數的參數不同(包括類型、順序不同),那麼容易區別出它們是不同的函數。

重載與覆蓋

成員函數被重載的特徵:
(1)相同的範圍(在同一個類中);
(2)函數名字相同;
(3)參數不同;
(4)virtual 關鍵字可有可無。

覆蓋是指派生類函數覆蓋基類函數,特徵是:
(1)不同的範圍(分別位於派生類與基類);
(2)函數名字相同;
(3)參數相同;
(4)基類函數必須有virtual 關鍵字。

隱藏規則:

本來僅僅區別重載與覆蓋並不算困難,但是C++的隱藏規則使問題複雜性增加了許多。
這裏“隱藏”是指派生類的函數屏蔽了與其同名的基類函數,規則如下:
(1)如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual
關鍵字,基類的函數將被隱藏(注意別與重載混淆)。
(2)如果派生類的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual
關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)。


另一觀點

如果基類有某個函數的多個重載(overload)版本,而你在子類中重寫(overwrite)了其中的一個,或是子類添加新的函數版本,則所有基類的重載版本都被遮蔽。所以,正常情況下,在子類中應重寫基類中的所有重載版本。

具體地講,繼承類中的重載和重寫都包含了重寫的涵義,即只要函數名一樣,基類的函數版本就會被遮蔽,所以,在派生類中要保持基類的重載版本,就應該重寫所有基類的重載版本。重載只在噹噹前類中有效,繼承會失去重載的特性。也就是說,把基類的重載函數放在繼承類裏,就必須重寫。

 
2.C#中三個概念及實現
轉自:http://blog.chinaunix.net/u1/39332/showart_1330863.html

overload (重載)關鍵字: 無
1.使用的地方:同一類裏。(其實是同一類裏同一名稱的方法不同版本的一種叫法)
2.要重載的方法和被重載的方法要求:參數列表不同或返回類型和參數列表都不同,只有返回類型不同不能重載。(所謂的參數列表不同就是參數個數或者參數類型不同或者二者都不同)

overwrite (重寫)關鍵字:new
1.用來是從父類繼承的與是由了new關鍵字的方法的方法名一樣的所以方法無效就像父類裏不存在這些方法一樣。只要去方法名一樣別的沒要求。

override (覆寫)關鍵字: override  
1.override的方法必須父類的(直接父類或間接父類(就是向上n層的父類))虛方法或抽象方法其中抽象方法是必須覆寫的。
2.要求3處相同
相同的方法名稱稱;
相同的參數列表;
相同的返回類型。

using System;
using System.Collections.Generic;
using System.Text;

namespace Override_Overload_Overwrite
{
    class Parent
    {
        public void F()
        {
            Console.WriteLine("Parent.F()");
        }
        public virtual void G()
        {
            Console.WriteLine("Parent.G()");
        }
        public int Add(int x, int y)
        {
            return x + y;
        }
        //重載(overload)Add函數
        public float Add(float x, float y)
        {
            return x + y;
        }
    }
    class ChildOne:Parent
    {
        //重寫(overwrite)父類函數
        new public void F()
        {
            Console.WriteLine("ChildOne.F()"); 
        }
        //覆寫(override)父類虛函數,主要實現多態
        public override void G()
        {
            Console.WriteLine("ChildOne.G()");
        }
    }
    class ChildTwo:Parent
    {
        new public void F()
        {
            Console.WriteLine("ChildTwo.F()");
        }
        public override void G()
        {
            Console.WriteLine("ChildTwo.G()");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Parent childOne = new ChildOne();
            Parent childTwo = new ChildTwo();
            //調用Parent.F()
            childOne.F();
            childTwo.F();
            //實現多態
            childOne.G();
            childTwo.G();
            Parent load = new Parent();
            //重載(overload)
            Console.WriteLine(load.Add(1, 2));
            Console.WriteLine(load.Add(3.4f, 4.5f));
            Console.Read();
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章