過載 覆蓋和隱藏之細談

2021-04-13 02:26:08 字數 1536 閱讀 7256

最近幾個發現有些人問這方面的問題加上自己在學這方面的知道,便找了點關於這方面的資料,供初學者學習.下面我們來討論一下.

過載(overload)

這個好理解,在同個space域同名的.

引數必須不同,有關virtual無關.

覆蓋(override)

同名字,同引數,有virtual

覆蓋好理解比如show()函式

a派生了b

如果b中的show()覆蓋了a中的show()

但b中仍然有兩個show(),而不管是a類指標也好,b類物件呼叫也好,都只能呼叫b類自己的那個show();

而從a類繼承過來的show()函式真的就被覆蓋了,沒有了嗎? 答應是不對的.這時可以在b類物件顯示的呼叫a類繼承過來的show();

程式**:

#include 

using namespace std;

class a

int a;

}; class b:public a

int b;

}; int main()

總結:virtual, 覆蓋.

其實準確,通俗的講b類還是有兩個show(),只是呼叫由a繼承過來的show()只能通過顯示的呼叫方法 [類名::virtual函式名]

而不管是基類a的指標 (b b; a *p = &b; p->show())或者派生類的物件(b b; b.show()),都只能呼叫b類的自己本身存在的show()函式

隱藏hide

這個有點麻煩了...

什麼是隱藏情況?

1,同名同參無virtual

2,同名不同參不管有無virtual

程式**:

class a

;  //編號1

void rose(int a) {}   //編號2

}; class b:public a

; //編號3

void rose(int a, int b) {};  //編號4 };

//類b中的show()和rose()明顯是隱藏了類a的show()和rose()

隱藏的理解:

b類中其實有兩個show(),兩個rose();

但為什麼不叫過載呢?你會這樣想,但我可以告訴你,因為類b中的兩個show(),兩個rose(),不是都可以被類b物件呼叫的.

//----1----//

編號1和編號2,在類b中哪怕存在,但只能通過類a的指標呼叫,而不能通過b類物件呼叫,如:

程式**:

a *p = new b;

p->show(); 

p->rose(3);

p->rose(3,5); //error

//----2----//

編號3和程式設計4,只能通過類b物件呼叫,而不能通過類a的指標呼叫,如:

程式**:

b b;

b.show();

b.rose(3,5);

b.rose(4); //error

C 之過載覆蓋和隱藏

繼承體系下同名成員函式的三種關係 在同一作用域內 函式名相同,引數列表不同 分三種情況 引數個數不同,引數型別不同,引數個數和型別都不同 返回值型別可以相同也可以不同 在不同作用域內,分別在父類和子類 函式名相同,引數列表相同,返回值型別相同,協變除外 下面會介紹什麼是協變 基類函式必須有virtu...

過載 覆蓋和隱藏

部分文字內容摘自 高質量c c程式設計 1 過載 overload 1 相同的範圍,在同乙個類中。2 函式名相同,引數不同。3 virtual可有可無。這在平時設計中用的比較多,比如遊戲中角色說話,可以設計成 void senddialog const char content 預設 void se...

過載 覆蓋 隱藏

學習c 些許時間了,隨便寫點東西吧。過載 覆蓋 隱藏 1.過載 相同作用域,函式名相同,引數不同,virtual關鍵字可有可無。2.覆蓋 不同作用域,函式名相同,引數相同,有virtual關鍵字。3.隱藏 一般是父類和子類之間,函式名相同,引數不同時,不管有沒有virtual關鍵字都會導致隱藏。函式...