2011-05-29 50 views
7

我有一个遗留代码:方法超载而继承在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; 
}; 
+0

你应该发布你正在得到的确切的错误。 – 2011-05-29 09:10:54

回答

6

您需要明确地将foo导入Iface12类,因此您会得到两个重载函数Iface12::foo

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

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

+0

+1。这是正确的方法。 – Nawaz 2011-05-29 09:30:51

+0

但是有没有办法在一个语句中从'Iface1'范围导入所有方法?像'使用Iface1;'这样的东西不起作用。 – barankin 2011-05-29 10:04:27

+0

@barakin,没有没有这样的方法。 – Begemoth 2011-05-29 10:10:53

2

如果问题是在邮件中IMPL,你可以解决它:

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

...等等。

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

+0

是的,它的工作原理!感谢所有的帮助!解决了。 – barankin 2011-05-29 09:15:29

+1

-1请参阅我对Als anwser的评论。 – Begemoth 2011-05-29 09:20:52

+0

@Begemoth,我不认为OP作为例子的代码是确切的代码运行;否则,他/她不会说问题解决了。你的要求是真实的,只考虑到作为例子给出的确切代码。 – Baltasarq 2011-05-29 09:26:19