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

Methods overloading while inheritance in C++

本文关键字:重载 方法 继承 C++      更新时间:2023-10-16

我有一个遗留代码:

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;
};

您需要将foo显式导入到Iface12类中,因此您将获得两个重载函数Iface12::foo

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

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

如果问题在要impl的消息中,您可以使用进行修复

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

等等

编辑:我已经测试过了,模糊性已经结束了。