1. 程式人生 > >函式過載重寫重定義

函式過載重寫重定義

一.首先問題的引出

看如下程式碼,方便分析說明給函式編號

class parent
{
public:
	//1.virtual void fun()
	{
		cout << "parent->fun()..." << endl;
	}
	//2.virtual void fun(int i)
	{
		cout << "parent->fun(int i)  " << i << endl;
	}
	//3.virtual void fun(int i, int j)
	{
		cout << "parent->fun(int i,int j) " << i << j << endl;
	}
};
class child:public parent
{
public:
	//4.virtual void fun(int i, int j)
	{
		cout << "child->fun(int i,int j) " << i << j << endl;
	}
	//5.virtual void fun(int i, int j, int k)
	{
		cout << "child->fun(int i,int j,int k)" << endl;
	}
};
int main()
{
	child c1;
	c1.fun();
	system("pause");
	return 0;
}
這樣看的話會有點蒙圈,那簡單的看下面這個示意圖


有幾個問題:

1.為什麼會出現這個錯誤?

2.子類中的fun函式和父類中的fun函式是什麼關係?

下面經過上面 的例子後我們看看真正的概念

二.函式過載與函式重寫

1.函式過載:必須在同一個類中進行                        子類無法過載父類函式                        父類同名函式將被名稱覆蓋                        過載是在編譯器期間根據函式引數型別和個數決定函式的呼叫 2.函式重寫:1.必須發生在父類與子類之間                        2.並且父類和子類中的函式有完全相同的原型                        3.使用virtual關鍵字宣告之後能夠產生多型(如果不使用virtual的重寫,那叫重定義)                        4.多型是在執行期間根據具體物件的型別決定函式呼叫 通過對上述概念的理解,我們來看上述程式碼的問題 ①1,2,3為函式過載;4,5為過載函式 ②3,4為函式重寫 ③如果去掉virtual關鍵字,3,4就是非虛擬函式重寫,即重定義 現在看發生剛才錯誤的原因:  子類無法過載父類函式,  父類同名函式將被名稱覆蓋。 因為父類中的fun被子類中的fun覆蓋,佔用了父類fun函式的位置,編譯器開始在子類中找fun()無參函式,沒有找到,所以出現錯誤。 那麼怎麼解決呢? 加上域作用符就好了。
int main()
{
	child c1;
	c1.parent::fun();
	system("pause");
	return 0;
}