class A
{
public:
int func1()
{
cout<<"A's func1";
}
}
class B:public A
{
public:
int func1()
{
cout<<"B's func1";
}
}
在上面的代碼片段中,是函數'func1()'在類B中重載嗎?函數覆蓋或超載
或越來越被B類覆蓋..?
class A
{
public:
int func1()
{
cout<<"A's func1";
}
}
class B:public A
{
public:
int func1()
{
cout<<"B's func1";
}
}
在上面的代碼片段中,是函數'func1()'在類B中重載嗎?函數覆蓋或超載
或越來越被B類覆蓋..?
覆蓋只能在基類成員函數聲明爲虛擬時發生。僅當兩個函數具有不同的簽名時纔會發生重載。
這些條件都不適用於此。在這種情況下,B::func1
只是隱藏了A::func1
。
附註:我指出的重載條件是必要的,但在這種情況下還不夠。即使您聲明B::func1(int i)
,以便籤名不同,B::func1
仍然會因爲C++的名稱查找規則而隱藏A::func1
。
血淋淋的細節:當您編寫b->func1()
時,C++在B
的範圍內首先查找名稱func1
;由於B
在其範圍內具有該名稱,因此編譯器在此處結束搜索,然後再查看,即使b->func1()
最終無法與簽名B::func1(int i)
匹配。你可以改變這種行爲,並通過添加using A::func1
到B
定義,從而超載A::func1()
和B::func1(int i)
:
class B: public A
{
public:
using A::func1;
int func1(int i)
{
cout << "B's func1(" << i << ")\n";
}
};
另外,不要在每個類定義的末尾忘記所需的分號。
如果你取得了在課堂上func1
一個虛擬那麼B類將被重寫func1
,因爲它不是虛擬的,你都躲在A.
在繼承基類func1
實現中,如果(對容易理解的公開說明符)公共說明符在基類中具有成員函數,如果我們通過使用基類的對象而不是基類 的成員函數通過主要的 函數調用基類,而不是父類成員函數意味着函數被覆蓋。
(前提是成員函數的名稱應該相同)。
#include<iostream.h>
class a
{
public:
{
cout<<"Hello from class a";
}
};
class b:public a
{
public:
void hello()
{
cout<<"Hello from class b";
}
};
main()
{
b obj;
obj.hello();
}
輸出是:
你好從B級
我會建議不使用大寫鎖定您的問題或答案。這提高了大多數其他用戶的可讀性。如果其他格式化選項不可用,我只能使用大寫字母鎖定強調單詞。 – Alex 2012-03-15 18:13:33