C++重载、覆盖和遮蔽
這個講的有點繞,多看幾遍,理解一下,再來總結吧。
函數簽名包括函數名和函數參數的個數、順序以及參數數據類型。
1) 重載
函數重載是指兩個函數具有相同的函數名,但是函數參數個數或參數類型不同。函數重載多發生在頂層函數之間或者同一個類中,函數重載不需要構成繼承關系。
?
2) 覆蓋
覆蓋構成條件和多態構成條件是相同的,覆蓋是一種函數間的表現關系,而多態描述的是函數的一種性質,二者所描述的其實是同一種語法現象。
覆蓋首先要求有繼承關系,其次是要求構成繼承關系的兩個類中必須具有相同函數簽名的成員函數,并且這兩個成員函數必須是虛成員函數,具備這兩個條件后,派生類中的虛成員函數則會覆蓋基類中的同名的虛成員函數。如果我們通過基類指針或引用來調用虛成員函數,則會形成多態。
#include<iostream> using namespace std;class base { public :virtual void vir1(){}virtual void vir2(){} };class derived : public base { public:void vir1(){}void vir2(){} };int main() {base * p;p = new derived;p->vir1();p->vir2();delete p;return 0; }3) 遮蔽
函數遮蔽同樣要求構成繼承關系,構成繼承關系的兩個類中具有相同函數名的函數,如果這兩個函數不夠成覆蓋關系,則就構成了遮蔽關系。遮蔽理解起來很簡單,只要派生類與基類中具有相同函數名(注意不是相同函數簽名,只需要相同函數名就可以了)并且不構成覆蓋關系即為遮蔽。
遮蔽可以分為兩種情況,一種是非虛函數之間,另一種則是虛函數之間。我們通過程序示例來分別介紹這兩種遮蔽情況。
?
以上總結了函數名相同的所有情況,函數名相同利用的好可以為程序設計帶來較大的便利,使用的不好則容易誤導程序設計人員。一般來講,函數名相同通常會用在以下幾種情況中:
- 頂層函數的函數重載。對于程序設計人員而言,實現功能相同但所處理數據類型不同的函數時,采用函數重載的方式將會帶來極大的方便。例如設計一個求絕對值函數,針對整型和double類型各設及一個abs函數,調用時而無需關注參數類型,這樣的設計是很方便的。
- 類中的成員函數的重載,這種函數重載和頂層函數重載同樣能給我們的程序帶來方便。
- 類中的構造函數重載,設計多個構造函數,用于不同的初始化對象方式。
- 在繼承層次中為了使用多態特性而采用相同函數簽名。
除此之外函數名相同還會導致繼承層次中的函數遮蔽,而函數遮蔽這一特性通常會使得程序難以理解,因此建議謹慎使用函數遮蔽機制。
總結
以上是生活随笔為你收集整理的C++重载、覆盖和遮蔽的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++静态成员函数
- 下一篇: s3c2440移植MQTT