2016-01-21 95 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) {} 
};