可能重复:
Why does an overridden function in the derived class hide other overloads of the base class?
我在用作模板参数的类中使用继承方法时遇到问题。如下所示:
class D
{
};
class A
{
public:
void f( D &d ){};
};
class B: public A
{
public:
void f( int ) {};
};
template<typename F>
class C
{
public:
void doit() { D d; f->f(d); };
F *f;
};
int main()
{
C<B> cb;
cb.doit();
}
这是我试图编译它的原因:
g++ testtemplate.cpp
testtemplate.cpp: In member function ‘void C<F>::doit() [with F = B]’:
testtemplate.cpp:28: instantiated from here
testtemplate.cpp:21: error: no matching function for call to ‘B::f(D&)’
testtemplate.cpp:14: note: candidates are: void B::f(int)
但是,如果我删除void f(int){}方法,编译器会找到原始方法f(D&amp; d)。看起来原始方法被新的方法遮蔽了。我想知道原因。
答案 0 :(得分:1)
你可以这样做
class B: public A
{
public:
using A::f;
void f( int ) {};
};
基本上re-declaring the base class method with a different signature隐藏了所有具有相同名称的基类方法。
答案 1 :(得分:1)
确实如此,方法B.f
隐藏了A.f
。如果您希望它在B
中可用,则需要使用using指令:
class B: public A
{
public:
using A::f;
void f( int ) {};
};
答案 2 :(得分:0)
派生类的成员将隐藏任何具有相同名称的基类成员。为了在A::f
中提供B
,您需要使用声明:
class B: public A
{
public:
using A::f; // <--- add this
void f( int ) {};
};