当类用作模板参数时丢失继承方法

时间:2012-01-20 16:29:20

标签: c++ templates inheritance

  

可能重复:
  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)。看起来原始方法被新的方法遮蔽了。我想知道原因。

3 个答案:

答案 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 ) {};
};