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

bar*_*kin 7 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
{
};
Run Code Online (Sandbox Code Playgroud)

我需要为复合接口创建一个装饰器.以下代码甚至没有编译,因为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;
};
Run Code Online (Sandbox Code Playgroud)

Beg*_*oth 6

您需要明确导入fooIface12类中,因此您将获得两个重载函数Iface12::foo.

struct Iface12 : Iface1, Iface2
{
  using Iface1::foo;
  using Iface2::foo;
};
Run Code Online (Sandbox Code Playgroud)

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