2010-10-17 90 views
3
class A 
{ 
    public: 
      int func1() 
      { 
       cout<<"A's func1"; 
      } 
} 

class B:public A 
{ 
    public: 
      int func1() 
      { 
       cout<<"B's func1"; 
      } 
} 

在上面的代碼片段中,是函數'func1()'在類B中重載嗎?函數覆蓋或超載

或越來越被B類覆蓋..?

回答

13

覆蓋只能在基類成員函數聲明爲虛擬時發生。僅當兩個函數具有不同的簽名時纔會發生重載。

這些條件都不適用於此。在這種情況下,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::func1B定義,從而超載A::func1()B::func1(int i)

class B: public A 
{ 
public: 
    using A::func1; 
    int func1(int i) 
    { 
     cout << "B's func1(" << i << ")\n"; 
    } 
}; 

另外,不要在每個類定義的末尾忘記所需的分號。

3

如果你取得了在課堂上func1一個虛擬那麼B類將被重寫func1,因爲它不是虛擬的,你都躲在A.

-1

在繼承基類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級

+1

我會建議不使用大寫鎖定您的問題或答案。這提高了大多數其他用戶的可讀性。如果其他格式化選項不可用,我只能使用大寫字母鎖定強調單詞。 – Alex 2012-03-15 18:13:33