2016-12-09 57 views
3

我正在使用一些像這樣定義的第三方庫類。我如何聲明一個指向共享公共接口的不同類的指針?

class A : public Interface1, public Interface2 {}; 
class B : public Interface1, public Interface2 {}; 

它們不共享一個公共基類。是否可以聲明一個可以引用A類和B類的單一指針類型?

請注意,我使用的是第三方庫,並且不能重新定義A和B.如果我能那麼我會做到這一點:

class Base : public Interface1, public Interface2 {}; 
class A : public Base {}; 
class B : public Base {}; 

,然後我可以簡單地用一個指針基類。

Base *pBase; 
+2

公共基類是* * Interface1 * *或* Interface2。如果你不能重構代碼,那麼真的沒有辦法繞過它。你應該使用哪一個取決於情況和你目前需要的。 –

+1

我並不是建議使用它,但'void *'可以引用任何東西。也可以創建一個「指針」類,這個類可以同時擁有兩種類型。 – Steeve

回答

0

如果您無法重構代碼,則無法直接進行此操作。

這就是說,你仍然可以創建一個類來擦除類型,只要需要指向Interface1Interface2的指針,就可以使用該類。
作爲一個例子:

struct S { 
    template<typename T> 
    S(T *t): iface1{t}, iface2{t} {} 

    operator Interface1 *() { return iface1; } 
    operator Interface2 *() { return iface2; } 

private: 
    Interface1 *iface1; 
    Interface2 *iface2; 
}; 

它有一個很大的缺點與我不知道你是否能處理:一個指向S不能分配的指針InterfaceN
在其他方面:

struct Interface1 {}; 
struct Interface2 {}; 

class A : public Interface1, public Interface2 {}; 
class B : public Interface1, public Interface2 {}; 

struct S { 
    template<typename T> 
    S(T *t): iface1{t}, iface2{t} {} 

    operator Interface1 *() { return iface1; } 
    operator Interface2 *() { return iface2; } 

private: 
    Interface1 *iface1; 
    Interface2 *iface2; 
}; 

int main() { 
    A a; 
    S sa{&a}; 

    // S can be assigned to a pointer to InterfaceN 
    Interface1 *i1ptr = sa; 
    Interface2 *i2ptr = sa; 

    S *sptr = &sa; 

    // sptr cannot be assigned to a pointer 
    // to InterfaceN but you can get one 
    // out of it dereferencing 
    i1ptr = *sptr; 
    i2ptr = *sptr; 
} 

如果你能接受它,這是一個骯髒的和可行的解決方法。


說實話,我不明白爲什麼你應該做的。您可以簡單地創建函數模板並傳遞指向AB和所有其他類型的指針。
無論如何,我不知道什麼是真正的問題,我不知道這個問題。
因此,我希望它有幫助。

相關問題