2016-06-14 33 views
2

我一直認爲基類的公有方法確實被派生類繼承,甚至認爲派生類沒有定義該特定方法。例如如何調用未在派生類中定義的基類的函數?

#include <iostream> 

using namespace std; 


    class A { 
    public: 
     int f() { cout << 3; return 0;} 
     int f(int x) {cout << x; return 0;} 
    }; 

    class B: public A { 
    public: 
     int f() {std::cout << 5; return 0;} 

    }; 


    int main(){ 
     B ob; 
     ob.f(7); 

     return 0; 
    } 

我期待的結果是:7,但我得到的編譯錯誤說

錯誤:太多的參數函數調用,預期爲0,有1個;你的意思」 A :: f'

我知道錯誤是想說什麼,但我有點困惑,基類的功能沒有被調用。

+3

超載在派生類中的函數隱藏了所有的基類版本 –

+0

使用虛擬關鍵字A – ZivS

+1

我發現了一個從stackoverflow鏈接 - http://stackoverflow.com/questions/411103/function-with-same-n ame-but-different-signature-in-derived-class,它清楚地解釋了這個問題。 – pokche

回答

6

在派生類中重載方法會隱藏所有基類版本。即使簽名不同,如果派生類中存在與基類中名稱相同的方法,那麼您將無法直接調用基類版本。

你可以做

ob.A::f(7); 
2

與您發佈的代碼,B::f陰影A::f所有版本。您可以使用幾種方法從B類型的對象中調用A::f(int)

  1. 明確使用A::f

    B ob; 
    ob.A::f(7); 
    
  2. 帶來A::f所有版本進入B範圍。

    class B: public A { 
        public: 
         using A::f; 
         int f() {std::cout << 5; return 0;} 
    
    }; 
    

    現在你可以使用:

    B ob; 
    ob.f(7); 
    
+0

@ R Sahu,但上述案例適用於Java。 – a874

+0

@ a874,我不熟悉Java。我無法對此發表評論。但是,這與它是否在C++中起作用無關。 –

2

您可以用另一種方式:

class B: public A { 
    public: 
     using A::f; 
     int f() {std::cout << 5; return 0;} 

    }; 
相關問題