C 中的覆蓋與隱藏(詳細講解)

2021-09-27 07:41:11 字數 1679 閱讀 5481

c++類中覆蓋與隱藏一直是乙個容易理解出錯的地方,接下來我就詳細講解一下區別在何處

覆蓋指的是子類覆蓋父類函式(被覆蓋),特徵是:

1.分別位於子類和父類中

2.函式名字與引數都相同

3.父類的函式是虛函式(virtual)

隱藏指的是子類隱藏了父類的函式(還存在),具有以下特徵:

子類的函式與父類的名稱相同,但是引數不同,父類函式被隱藏

子類函式與父類函式的名稱相同,引數也相同,但是父類函式沒有virtual,父類函式被隱藏

#includeusing namespace std;

class father

virtual void show2()

};class son:public father

virtual void show2()

};int main()

father::show1

son::show2

son::show1

son::show2

請按任意鍵繼續. . .

因為show1是非virtual函式,呼叫它的物件型別為靜態型別即父類(靜態聯編),所以呼叫的是父類的物件

但是show2為virtual函式,呼叫它的物件型別為動態型別即指標指向的型別(動態聯編),所以呼叫的是子類的型別

if 子類的函式與父類的名稱相同,但是引數不同

父類函式被隱藏

else if 子類函式與父類函式的名稱相同&&引數也相同&&但是父類函式沒有virtual

父類函式被隱藏

else if 子類函式與父類函式的名稱相同&&引數也相同&&但是父類函式有virtual

父類函式被覆蓋

定義乙個動物(animal)類,要求含有虛函式eat和move,並定義建構函式和虛析構函式

定義乙個狗(dog)類,要求公有繼承動物類,定義建構函式和虛析構函式,並實現自己的eat和move函式

使用父類物件例項化子類,呼叫子類成員函式

#include#include#includeusing namespace std;

/** * 定義動物類:animal

* 成員函式:eat()、move()

*/class animal

// 析構函式

virtual ~animal()

// 成員函式eat()

virtual void eat()

// 成員函式move()

virtual void move()

};/**

* 定義狗類:dog

* 此類公有繼承動物類

* 成員函式:父類中的成員函式

*/class dog : public animal

// 析構函式

virtual ~dog()

// 成員函式eat()

virtual void eat()

// 成員函式move()

virtual void move()

};int main(void)

animal

dogdog -- eat

dog -- move

~dog

~animal

請按任意鍵繼續. . .

C 中的覆蓋與隱藏(詳細講解)

c 類中覆蓋與隱藏一直是乙個容易理解出錯的地方,接下來我就詳細講解一下區別在何處 覆蓋指的是子類覆蓋父類函式 被覆蓋 特徵是 1.分別位於子類和父類中 2.函式名字與引數都相同 3.父類的函式是虛函式 virtual 隱藏指的是子類隱藏了父類的函式 還存在 具有以下特徵 子類的函式與父類的名稱相同,...

C 中的覆蓋 過載與隱藏

c 中類本身之間的函式關係與基類和子類之間的函式關係有 覆蓋 過載與隱藏。1 覆蓋 c 中在基類用virtual定義的函式在子類中重新定義,此時稱為覆蓋,即子類對父類函式的覆蓋。2 過載 同乙個類中定義了多個同名但其形參不同的函式,這些同名函式之間為過載。3 隱藏 函式的隱藏有兩種情況。第一,如果派...

C 中的函式過載 覆蓋與隱藏

在c 語言中,函式扮演著很重要的角色,不管面向過程設計,還是基於物件設計 不管是物件導向程式設計,還是基於泛型程式設計,函式都可以隨處而見。在談論c 中的函式過載 覆蓋和隱藏之前,先回顧下函式的基礎知識。函式的宣告包括函式的返回值型別,函式名稱,引數列表 引數的型別 引數的個數 引數的順序 例如,宣...