最近幾個發現有些人問這方面的問題加上自己在學這方面的知道,便找了點關於這方面的資料,供初學者學習.下面我們來討論一下.
過載(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關鍵字都會導致隱藏。函式...