2013-10-14 229 views
1

是否有可能繼承同一個類中的接口和實現mixin?就像這樣:多繼承,繼承接口和implmentation

class Interface 
{ 
public: 
    virtual void method()=0; 
}; 

class Component 
{ 
public: 
    void method(){ /*do something*/}; 
}; 

class MyClass : public Interface, public Component 
{}; 

... 
... 
Interface* p = new MyClass(); p.method(); 

這個想法是從接口繼承的純虛函數是通過繼承組件在MyClass中實現的。這不會編譯;我需要這樣做:

class MyClass : public Interface, public Component 
{ 
public: 
    void method(){Component::method();} override 
}; 

是否有可能以某種方式避免顯式覆蓋和委派給組件,也許通過使用模板莫名其妙?

回答

2

如果你想避免顯式重寫和委託給組件,那麼就沒有辦法繼承這種綁定的某種類型的接口派生類,因爲你想調用ahas最終在派生類中虛函數表。

我想你可以把它與一個鑽石般的繼承結構和虛擬繼承工作,但它並不完全相當:

class Interface 
{ 
public: 
    virtual void method()=0; 
}; 

class Component: virtual public Interface 
{ 
public: 
    virtual void method(){ /*do something*/}; 
}; 


class MyClass : virtual public Interface, private Component 
{ 
public: 
    using Component::method; 
}; 

平時免責聲明:虛擬繼承是expensive

我曾嘗試使用模板找到更好的東西,但我不認爲有一種方法可以將組件方法綁定到虛擬方法,而不必從組件繼承接口或手動編寫綁定代碼。