纯虚拟的替代参数列表不会继承(需要"使用")

时间:2014-10-30 07:53:37

标签: c++ inheritance pure-virtual

我有一个带有一些纯虚拟的基类,我希望它提供几种方法的默认实现,如果需要可以覆盖它们。我把问题归结为以下几点:

class A {};
class B {};

class Base {
public:
  virtual void foo (const A&) {};
  virtual void foo (const B&) = 0;
};

class Derived : public Base {
public:
  virtual void foo(const B&) {};
};

int main(int argv, char** argc) {
  Derived d;
  d.foo(A());
  return 0;
}

由于我根本不理解的原因,这在g ++ 4.8.2上失败了:

g++ scratch.cpp -o scratch
scratch.cpp: In function ‘int main(int, char**)’:
scratch.cpp:17:12: error: no matching function for call to ‘Derived::foo(A)’
   d.foo(A());
        ^
scratch.cpp:17:12: note: candidate is:
scratch.cpp:12:16: note: virtual void Derived::foo(const B&)
   virtual void foo(const B&) {};
            ^
scratch.cpp:12:16: note:   no known conversion for argument 1 from ‘A’ to ‘const B&’ 

如果我在foo(const B&)中定义Base并将Derived留空,则问题就会消失。我在这里阅读了文档和一些问题,但没有任何迹象表明为什么这会成为一个问题。在我的真实代码中,Base::foo(const A&)将从b对象构建B类型的特殊对象A,然后调用foo(b)

3 个答案:

答案 0 :(得分:1)

将此行添加到Derived类定义中:

using Base::foo;

这将解决Derived中的foo(B)定义隐藏Base中的foo(A)和foo(B)函数的问题。

答案 1 :(得分:0)

几分钟之内,我就找到了。

我需要using Base::foo中的Derived

http://www.parashift.com/c++-faq-lite/hiding-rule.html

再次感谢StackOverflow帮助我回答我自己的问题。没有你就无法做到。

答案 2 :(得分:0)

如果您无法修改基类和/或派生类,并且仍想调用(可访问)方法,则可以完全限定呼叫:

Derived d;
d.Base::foo(A());