“using”关键字是否可以继承更少的函数?

时间:2011-05-27 08:43:04

标签: c++ inheritance using

Derived中有一个template foo(T)foo()中有Base的2次重载。

struct Base
{
  void foo (int x) {}
  void foo (double x) {}
};

struct Derived : Base
{
  template<typename T> void foo (T x) {}
  using Base::foo;
};

现在,使用foo()对象调用Derived时;如果适用,我只想使用Base::foo(int),否则应调用Derived::foo(T)

Derived obj;
obj.foo(4);  // calls B::foo(int)
obj.foo(4.5); // calls B::foo(double) <-- can we call Derived::foo(T) ?

简而言之,我想要一个效果:

using Base::foo(int);

有可能吗?以上只是一个例子。

2 个答案:

答案 0 :(得分:6)

using将所有重载都纳入范围。只需将其隐藏在派生类中,写入更多内容即可完成工作:

struct Derived : Base
{
  template<typename T> void foo (T x) {}
  void foo(int x){
    Base::foo(x);
  }
};

答案 1 :(得分:1)

如果你想继续使用模板方法,那么相当简洁的方法是将你的模板专门用于整理:

template<> void Derived::foo<int> (int x) { Base::foo(x) };

所有内容都将通过using引入,因此我会在您的情况下避免这种情况,但您可以根据需要创建任意数量的专业化。

好处是他们不会丢弃你的课堂声明,但如果你的专业化不明显,这也会带来维护问题。