2011-05-29 49 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