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

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 选择是否用自己的实现覆盖。 嗯,是的.. 说得通!

以上是关于纯虚拟的替代参数列表不会继承(需要“使用”)的主要内容,如果未能解决你的问题,请参考以下文章

Qwt 替代品

通过模板或纯虚拟基类继承动态类型文件访问?

使用纯多态性和继承从基类调用派生类上的函数而不进行强制转换?

纯 HTML AJAX 网站中的页面加载替代方案

从可变参数模板中扩展的 decltype 继承

四. Java继承和多态3. 继承中的方法的覆盖和重载