我有一个带有一些纯虚拟的基类,我希望它提供几种方法的默认实现,如果需要可以覆盖它们。我把问题归结为以下几点:
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)
。
答案 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());