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);
}
}
}