2016-01-21 93 views
0

我正在寫一些C++代碼的樣子:繼承相關的C++編譯錯誤

class Base { 
public: 
    virtual ~Base() {} 
    void foo(int a) {} 
    virtual void foo(int a, int b) = 0; 
}; 

class Derived: public Base { 
public: 
    virtual void foo(int a, int b) {} 
}; 

int main() 
{ 
    Derived o; 
    o.foo(1); 

    return 0; 
} 

這將產生以下錯誤:

candidate expects 2 arguments, 1 provided 

起初我以爲一個compilator錯誤的,但在嘗試過不同的結果並總是得到相同的結果後,我意識到它必須是標準的一部分。 有人可以指出這個錯誤的原因嗎?

回答

1

這是因爲名稱隱藏。

在與基類中名稱相同的派生類中聲明函數隱藏了中基類中的函數。

如果你也希望能夠調用void foo(int)Derived,放在一個using聲明:

class Derived: public Base { 
public: 
    using Base::foo; //here 
    virtual void foo(int a, int b) {} 
};