C 與C 對函式隱藏的不同處理

2021-04-21 00:45:03 字數 1163 閱讀 7492

看一段簡單的c++**

#include 

class a

void f(int x, int y)

};class b : public a

};int main(int argc, char * argv)

執行結果應該是什麼呢?

記住這種情況不會實現函式過載的,因此呼叫b.f(2,3)會出現編譯錯誤,而呼叫b.f(2.3)不會呼叫基類的f函式,而會呼叫派生類的f函式(引數型別隱性轉換),函式隱藏的概念摘錄如下

隱藏是指派生類的函式遮蔽了與其同名的基類函式,規則如下:

如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆)

如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)

再看同樣**的c#實現

using system;

using system.collections.generic;

using system.text;

namespace functiontest

}public

class a

public

void f(int x, int y)

}public

class b : a}}

會發現與c++的不同之處,在c#中不會進行函式隱藏,即使派生類與基類同名,引數不同也能實現類似函式過載,執行結果是

a::f(float)

a::f(int,int)

這樣的結果才會符合我們預期的設想,也許這也算是c++設計的乙個不足之處吧

為了驗證這真的算是函式過載麼,把上面的程式簡單改變一下,再看下面一段c#**

using system;

using system.collections.generic;

using system.text;

namespace functiontest

}public

class a

public

void f(int x, int y)

}public

class b : a}}

執行結果是

b::f(float)

a::f(int,int)

C 與C 函式過載 隱藏與重寫的異同

很多人無法正確區分函式過載 函式隱藏與函式重寫這三個概念,下面將給這三個概念下個定義,並討論c 與c 中的異同。過載函式 overloaded function 在相同的作用域中的函式名相同,而參數列不同,即通過函式的參數列而唯一標識並且來區分函式的一種特殊的函式。在c 和c 中,都不能以返回值區分...

對C 名字隱藏的理解

overwrite 重寫 是指派生類的函式遮蔽了與其同名的基類函式,規則如下 1 如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual關鍵字,基類的函式將被隱藏 注意別與過載混淆 如何理解這句呢?看這個例子 class firstclass void firstclass m...

C 中的函式隱藏

只要基類在定義成員函式時已經宣告了virtual關鍵字,在派生類實現的時候覆蓋該函式時,virtual關鍵字可加可不加,不影響多型的實現。容易與隱藏混淆 隱藏是指派生類的函式遮蔽了與其同名的基類函式,規則如下 1 如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual關鍵字,基...