纯虚拟的替代参数列表不会继承(需要“使用”)
Posted
技术标签:
【中文标题】纯虚拟的替代参数列表不会继承(需要“使用”)【英文标题】:Alternate argument lists of pure virtual won't inherit (needed "using") 【发布时间】:2014-10-30 07:53:36 【问题描述】:我有一个带有几个纯虚拟的基类,我希望它提供几个方法的默认实现,如果需要可以覆盖这些方法。我将我的问题归结为以下几点:
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&’
如果我在Base
中定义foo(const B&)
并将Derived
留空,问题就会消失。我已经阅读了文档和这里的一些问题,但没有任何迹象表明这会是一个问题。在我的真实代码中,Base::foo(const A&)
将从A
对象构建一个B
类型的特殊对象b
,然后调用foo(b)
。
【问题讨论】:
【参考方案1】:将此行添加到您的 Derived
类定义中:
using Base::foo;
这将解决您在 Derived 中的 foo(B) 定义隐藏了 Base 中的 foo(A) 和 foo(B) 函数的问题。
【讨论】:
【参考方案2】:几分钟之内,我就找到了。
我需要using Base::foo
中的Derived
。
http://www.parashift.com/c++-faq-lite/hiding-rule.html
再次感谢 *** 帮助我回答我自己的问题。没有你就无法做到。
【讨论】:
【参考方案3】:如果您无法修改基类和/或派生类,但仍想调用(可访问)方法,您可以完全限定调用:
Derived d;
d.Base::foo(A());
【讨论】:
我认为这不是我想要的。我很确定这将强制调用foo(const A&)
的Base
实现,即使Derived
覆盖它。我想留下Derived
选择是否用自己的实现覆盖。
嗯,是的.. 说得通!以上是关于纯虚拟的替代参数列表不会继承(需要“使用”)的主要内容,如果未能解决你的问题,请参考以下文章