天天看點

重載、重寫(覆寫)和隐藏

1、重載:是指在同一通路區内(同一個類)被聲明的具有不同參數清單的同名函數,在函數調用時可以通過參數清單來确定調用的對象,重載不關心函數的傳回值類型。即同一類中,同名不同參。

參數清單不同主要表現在以下幾個方面:

  • (1)參數的個數不同
  • (2)參數順序不同
  • (3)參數類型不同

這裡需要注意函數傳回值類型的不同,并不是重載。但函數聲明為const是可以被認定為重載的。const對象隻能調用cosnt方法,非const對象優先調用非const方法。

為什麼在c語言中不支援函數重載?

在函數編譯時,會給每個函數設定一庫函數名。而在c語言中,這個庫函數名的生成僅僅隻和函數名有關。假設一個函數的聲明為

int fun(int n,char m);
           

在c中的庫函數名稱為_fun,即僅僅之和函數名存在關系。

而在c++中的庫函數名稱為_fun_int_char,即和函數名和參數清單有關(注意:和函數傳回值無關)。

是以:在C語言中如何定義同名函數,編譯器是沒有辦法區分的,是以C語言中無法重載。

2、重寫(覆寫):在派生類中重載對基類中的函數重新進行了實作,其函數名、傳回值、參數清單都必須和基類中被重寫的函數一緻,這樣就可以實作通過基類指針或引用來通路派生類中重寫了的函數了。

3、隐藏:又被稱為同名隐藏,指在派生類中實作了和基類的同名的方法,這樣派生類的對象就會通路到派生類中實作的方法,而不是基類中的方法。

#include <iostream>
using namespace std;
class Test
{
public:
	int fun(int n)    
	{
		cout << "parent int n=" << n << endl;
		return 0;
	}
	char fun(char n)   //重載  同一個類的同名不同參的函數
	{
		cout << "parent char n=" << n << endl;
		return 0;
	}
	virtual int fun1(int m)
	{
		cout << "parent int m=" << m << endl;
		return 0;
	}
};
class TestChild :public Test
{
public:
	double fun(double n)//同名隐藏 派生類隐藏了基類的方法
	{
		cout << "child double n=" << n << endl;
		return 0;
	}
	int fun1(int m)  //重寫(覆寫)派生類覆寫了基類的方法
	{
		cout << "child int m=" << m << endl;
		return 0;
	}
};
int main()
{
	Test test;
	TestChild testChild;
	
	test.fun(2);
	test.fun('c');
	testChild.fun(1.1);
	Test *pTest = new Test();
	pTest->fun1(15);
	pTest = new TestChild();//通過父類指針使用基類的函數,可以寫virtual,也可以不寫
	pTest->fun1(20);
	return 0;
}
           

重載、重寫(覆寫)和隐藏的差別?

  • (1)重載在同一個類中,重寫和隐藏是在基類和派生類中。
  • (2)重寫(覆寫)派生類和基類的函數名,傳回值、參數清單必須全部一緻,而隐藏隻需要和基類函數同名即可。
  • (3)重寫(覆寫)基類必須為虛函數。