2011-10-07 84 views
6

我:C++多重繼承的功能合併

class XILightSource 
{ 
public: 
    virtual XVec2 position() const = 0; 
}; 

class XLightSprite : public XSprite, public XILightSource 
{ 

}; 

的問題是,XSprite已經有相同的功能position。我怎麼能說編譯器,我想使用XSprite::position函數作爲XILightSource::position()的實現?

回答

6

覆蓋它並調用XILightSource ::位置():

class XLightSprite : public XSprite, public XILightSource 
{ 
    public: 
    XVec2 position() const { return XSprite::position(); } 
}; 
0

只需添加一行:

class XLightSprite : public XSprite, public XILightSource 
{ 
public: 
    using XSprite::position; 
}; 
+2

不起作用。 XLightSprite仍然是抽象的。如果XlightSourse :: position不是純粹的,我認爲可以使用解決方案 – Andrew

0

其實,你並不需要做什麼特別的事情。

默認情況下,實現在XLightSpriteXVec2 position() const將隱藏XSpriteposition()和充當XLightSource定義的虛擬功能的重寫。

但是,如果你想澄清,你的目的是爲了覆蓋功能,您可以添加使用聲明然而

class XLightSprite : public XSprite, public XILightSource 
{ 
public: 
    using XSprite::position; 
    XVec2 position() const; 
}; 

,請注意,如果從XSprite位置()也是虛擬函數的格式相同,新的實現也將作爲XSprite中位置的重寫。

0

如果class XSprite已經具備該功能,那麼最好的方法是使XSpriteXILightSource的孩子(因爲它是抽象的)。這種方法的優點是你不必依賴多次繼承。即

class XILightSource 
{ 
public: 
    virtual XVec2 position() const = 0; 
}; 

class XSprite : public XILightSource 
{ 
public: 
    virtual XVec2 position() const { ... } 
}; 

class XLightSprite : public XSprite 
{ 
};