Overload(重載) Override(覆寫)Overwrite(重寫)

C++:
Overload(重載):函數或者方法有同樣的名稱,但是參數列表不相同的情形,這樣的同名不同參數的函數或者方法之間,互相稱之爲重載函數或者方法。
(1)相同的範圍(同一個類)
(2)函數名相同
(3)函數參數不同
Override(覆寫):從字面就可以知道,它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對接口方法的實現,在接口中一般只是對方法進行了聲明,而我們在實現時,就需要實現接口聲明的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。
(1)不同的範圍(分別位於派生類與基類);
(2)函數名字相同;
(3)參數相同;
(4)基類函數必須有virtual 關鍵字。

Overwrite(重寫):指派生類的函數屏蔽了與其同名的基類函數

(1)如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。

(2)如果派生類的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)。

#include <iostream>

using namespace std;

class TestOverload
{
public:
	TestOverload(){}
	virtual ~TestOverload(){}

	// 重載Overload
	void MyOverload(int a);
	void MyOverload(int a, int b);
	virtual void MyOverload(int a, int b, int c);
};

void TestOverload::MyOverload(int a)
{
	cout << "MyOverload a-" << "a:" << a << endl;
}

void TestOverload::MyOverload(int a, int b)
{
	cout << "MyOverload a b--" << "a:" << a << endl;
	cout << "MyOverload a b--" << "b:" << b << endl;
}

void TestOverload::MyOverload(int a, int b, int c)
{
	cout << "MyOverload a b c--" << "a:" << a << endl;
	cout << "MyOverload a b c--" << "b:" << b << endl;
	cout << "MyOverload a b c--" << "c:" << c << endl;
}

class TestOverride : public TestOverload
{
public:
	TestOverride(){};
	virtual ~TestOverride(){}

	// 重寫Overwrite
	void MyOverload(int a);
	// 覆寫Override
	virtual void MyOverload(int a, int b, int c);
};

void TestOverride::MyOverload(int a)
{
	cout << "MyOverwrite a-" << "a:" << a << endl;
}

void TestOverride::MyOverload(int a, int b, int c)
{
	cout << "MyOverride a b c--" << "a:" << a << endl;
	cout << "MyOverride a b c--" << "b:" << b << endl;
	cout << "MyOverride a b c--" << "c:" << c << endl;
}

int main()
{
	TestOverload t;
	t.MyOverload(1);
	t.MyOverload(2, 3);
	t.MyOverload(5, 6, 7);

	cout << "--------------" << endl;

	TestOverload* pt = new TestOverride();
	pt->MyOverload(8);
	((TestOverride*)pt)->MyOverload(18);
	pt->MyOverload(9, 10, 11);
}



C#:
overload (重載)關鍵字: 無
override (覆寫)關鍵字: override  
overwrite (重寫)關鍵字:new

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

namespace AceCSharpConsole
{
    class TestOverload
    {
	    public TestOverload(){}
	    ~TestOverload(){}

	    // 重載Overload
	    public void MyOverload(int a)
        {
            Console.WriteLine("MyOverload a:{0}", a);
        }

	    public void MyOverload(int a, int b)
        {
            Console.WriteLine("MyOverload a:{0}", a);
            Console.WriteLine("MyOverload b:{0}", b);
        }

	    public virtual void MyOverload(int a, int b, int c)
        {
            Console.WriteLine("MyOverload a:{0}", a);
            Console.WriteLine("MyOverload b:{0}", b);
            Console.WriteLine("MyOverload c:{0}", c);
        }
    };

    class TestOverride : TestOverload
    {
	    public TestOverride(){}
	    ~TestOverride(){}

	    // 重寫Overwrite
	    new public void MyOverload(int a)
        {
            Console.WriteLine("MyOverwrite {0}", a);
        }

	    // 覆寫Override
	    override public void MyOverload(int a, int b, int c)
        {
            Console.WriteLine("MyOverride a:{0}", a);
            Console.WriteLine("MyOverride b:{0}", b);
            Console.WriteLine("MyOverride c:{0}", c);
        }
    };
    
    class Program
    {
        static void Main(string[] args)
        {
            TestOverload t = new TestOverload();
            t.MyOverload(1);
            t.MyOverload(2, 3);
            t.MyOverload(5, 6, 7);

            TestOverload tp = new TestOverride();
            tp.MyOverload(8);
            ((TestOverride)tp).MyOverload(18);
            tp.MyOverload(9, 10, 11);

        }
    }
}



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