2009-11-14 28 views
8

假設我有一些像這樣的代碼:在C++中的子類重載的方法

class Base { 
    public: 
     virtual int Foo(int) = 0; 
}; 

class Derived : public Base { 
    public: 
     int Foo(int); 
     virtual double Foo(double) = 0; 
}; 

class Concrete : public Derived { 
    public:   
     double Foo(double); 
}; 

如果非要型混凝土的一個目的,爲什麼我不能調用foo(INT)?
如果我更改Foo(double)的名稱以使它不會重載Foo,那麼一切都很好,兩種方法都可以訪問,但這不是我想要的。
同樣,如果我刪除具體類和實現Foo(雙)派生,然後都可訪問,但再次,不是我想要的。

+0

我不明白這個問題。 GCC版本3.3.6和4.2.4都沒有抱怨地編譯這段代碼。 – 2009-11-14 17:25:03

+0

由於將整數隱式轉換爲雙精度 - 嘗試向函數添加跟蹤並執行具體的c; int i = 1; c.Foo(i);' – 2009-11-14 17:30:52

+0

如果你重新定義了子類中的虛擬方法,那麼這不是被稱爲覆蓋嗎? – mucaho 2015-11-05 17:41:00

回答

14

名稱查找發生,基類不會搜索稱爲Foo其他方法。 int Foo(int) in DerivedFoo隱藏在Concrete中。

您有多種選擇。

將呼叫更改爲顯式。

concrete.Derived::Foo(an_int); 

將使用聲明添加到混凝土。

class Concrete : public Derived { 
public:   
    using Derived::Foo; 
    double Foo(double); 
}; 

通過基礎引用調用該函數。

Derived& dref = concrete; 
dref.Foo(an_int); 
6

Foo(double)從您的基地隱藏功能。你可以把它雖然可見:所以一旦FooConcrete發現重載決議之前

class Concrete : public Derived 
{ 
public:   
    using Derived::Foo; 
    double Foo(double); 
}; 
+2

一個很好的解釋可以在http://stackoverflow.com/questions/411103/function-with-same-name-but-different-signature-in-derived-class/411112#411112找到 – 2009-11-14 17:18:31