看一段簡單的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關鍵字,基...