如何解决在C ++中继承时方法重载
| 我有一个遗留代码: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.Iface1::foo( arg1 );
// ...
impl.Iface2::foo( arg1,arg2 );
... 等等。
编辑:我已经对其进行了测试,并且模棱两可了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。