我有遗留代码:
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;
};
答案 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 );
......等等。
已编辑:我已对其进行了测试,结果模糊不清。