方法在C ++中继承时重载

时间:2011-05-29 09:00:23

标签: c++ inheritance overloading

我有遗留代码:

struct Iface1
{
  virtual ~Iface1() {}
  virtual void foo(const int arg1) const = 0;
};

struct Iface2
{
  virtual ~Iface2() {}
  virtual void foo(const int arg1, const int arg2) const = 0;
};

/// Composite interface
struct Iface12 : Iface1, Iface2
{
};

我需要为复合接口创建一个装饰器。以下代码甚至没有编译,因为G ++和MSVC推断调用哪种类型的foo()是“模糊的”。可以请任何人指出如何使下面的代码编译和工作? (不幸的是,我没有时间进行重构)。

我甚至不明白为什么编译器无法推断出要调用的函数,因为所有函数签名都是显式的。感谢。

struct IfaceDecorator : Iface12
{
  IfaceDecorator(Iface12& iface) : impl(iface) {}

  virtual void foo(const int arg1) const
  {
    impl.foo(arg1);
  }

 virtual void foo(const int arg1, const int arg2) const
 {
   impl.foo(arg1, arg2);
 }

private:
  Iface12& impl;
};

2 个答案:

答案 0 :(得分:6)

您需要将foo显式导入Iface12类,这样您才能获得两个重载函数Iface12::foo

struct Iface12 : Iface1, Iface2
{
  using Iface1::foo;
  using Iface2::foo;
};

具有相同名称的成员函数只有在同一个类中声明时才会相互重载,如果要重载继承的函数,则需要通过using ParentClass::functionName导入当前类中的名称。我认为这是最不让人惊讶的原则 - 除非你要求,否则你的会员功能不会超载。

答案 1 :(得分:2)

如果问题出现在要发送的邮件中,您可以使用以下方法解决问题:

impl.Iface1::foo( arg1 );
// ...
impl.Iface2::foo( arg1, arg2 );

......等等。

已编辑:我已对其进行了测试,结果模糊不清。