C++ override和overload的區別

轉載自http://www.cnblogs.com/tanky_woo/archive/2012/02/08/2343203.html

//Overload重載:
//功能相近的幾個函數用相同的名字表示,但參數不同(包括類型、順序不同),即函數重載。
//(1)相同範圍(在同一個類中)
//(2)函數名字相同
//(3)參數不同
//(4)virtual關鍵字可有可無。
//注意重載解析不考慮返回類型
//------函數名相同,參數不同且在相同範圍--重載

//Override覆蓋--重寫 :
//是指派生函數覆蓋基類函數,是C++多態的表現。
//(1)不同的範圍(分別位於派生類與基類)
//(2)函數的名字相同
//(3)參數相同
//(4)返回值相同
//(4)基類函數必須有virtual關鍵字
//----------派生類函數與基類函數完全相同且基類函數有virtual關鍵字,允許被派生類覆蓋

//Overwite--重定義
//(1)位於不同的範圍(分別位於派生類與基類)
//(2)函數名字相同
//(3)返回值可以不同
//(4)參數不同,不論有無virtual關鍵字,基類的函數被隱藏
//(5)參數相同,但是基函數沒有virtual關鍵字,基類函數被隱藏
//當派生類對基類函數進行了override/overwite  ,則派生類使用自己重新override/overwite的函數,否則它使用基類的函數

#include<iostream>
#include<complex>
using namespace std;

class Base{
public:

	virtual void a(int x){ cout << "Base::a(int)" << endl; }
	virtual void a(double x){ cout << "Base::a(double)" << endl; }  //overload Base ::a(int x)
	virtual void b(int x){ cout << "Base::b(int)" << endl; }
	void c(int x){ cout << "Base::c(int)" << endl; }
	void d(int x){ cout << "Base::d(int)" << endl; }

};

class Derived :public Base{
public:

	void a(complex<double>x){ cout << "Derived::a(complex)" << endl; }  //overwrite Base ::a()
	void b(int x){ cout << "Derived::b(int)" << endl; }  //override Base ::b(int)
	void c(int x){ cout << "Derived::c(int)" << endl; }

};

int main(){

	Base A;
	Derived B;


	A.a(1.0);   //Base::a(double);
	B.a(1.0);   //Derived::a(complex)

	A.b(10);   //Base::b(int)
	B.b(10);   //Derived::b(int)

	A.d(1);  //Base::d(int)
	B.d(1); //Base::d(int)

	system("pause");
	return 0;
}

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