C++中過載、重寫、重定義的區別

JunJie_1107發表於2020-12-20

函式過載:

過載是指相同的函式名,不同的引數列表(與返回值無關)

1、函式的名字必須相同
2、函式的引數列表必須不同,與引數列表的順序無關
3、返回值型別可以不同

函式重寫(覆寫)

覆寫是指子類的成員函式覆蓋了父類的虛擬函式

1、不同的範圍,分別位於基類和派生類中
2、函式名相同
3、引數列表相同
4、返回值相同
5、基類函式必須有virtual關鍵字
6、只有虛方法或抽象方法才能夠被覆寫

重定義(隱藏)

函式重定義指的是子類的成員函式遮蔽了與其同名的父類函式

1、如果派生類的函式和基類的函式同名,但是引數不同,此時,不管有無virtual,基類的函式被隱藏。

2、如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有vitual關鍵字,此時,基類的函式被隱藏。否則就是重寫。

程式碼示例:

#include <iostream>
using namespace std;

class Base {
public:
	// 普通成員函式
	void func() { 
		cout << "it's Base func()" << endl; 
	}	
	// 函式過載 func()
	void func(int a) { 
		cout << "it's Base func(), a = " << a << endl;
	} 
	// 虛擬函式
	virtual void func2() { 
		cout << "it's Base func2()" << endl; 
	}	
};


class Derived : public Base {
public:
	// 覆寫父類的虛擬函式
	// 也是對父類的func2()進行重定義,只不過帶有virtual關鍵字
	void func2() { 
		cout << "it's child 2" << endl;
	}	
	// 重定義 : 對於父類的func()
	void func(int a) {
		cout << "it's child func(), a = " << a << endl;
	}
};

int main() {
	Base* b;	//	父類指標
	Derived d;	//	子類物件

	b = &d;
	b->func();		// Base func()		子類繼承了父類的public介面,因此可以訪問父類介面
	b->func(100);	// Base func(2)		子類繼承了父類的public介面,因此可以訪問父類介面
	b->func2();		// Derived func2()	多型

	d.func(100);	// Derived func()	子類物件的介面
	d.func2();		// Derived func2()  子類物件的介面
	return 0;
}

程式碼輸出:

it's Base func()
it's Base func(), a = 100
it's child 2
it's child func(), a = 100
it's child 2

謝謝閱讀

相關文章