Слияние множественного наследования с ++ - PullRequest
6 голосов
/ 07 октября 2011

у меня есть:

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

class XLightSprite : public XSprite, public XILightSource
{

};

Проблема в том, что XSprite уже имеет такую ​​же функцию position. Как я могу сказать компилятору, что я хочу использовать функцию XSprite::position как реализацию XILightSource::position()?

Ответы [ 4 ]

6 голосов
/ 07 октября 2011

переопределите его и вызовите XILightSource :: position ():

class XLightSprite : public XSprite, public XILightSource
{
  public:
     XVec2 position() const { return  XSprite::position(); }
};
0 голосов
/ 07 октября 2011

Если class XSprite уже имеет эту функцию, то лучший способ сделать XSprite дочерним элементом XILightSource (так как оно абстрактно).Преимущество этого подхода заключается в том, что вам не нужно полагаться на множественное наследование без необходимости.т.е.

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

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

class XLightSprite : public XSprite
{
};
0 голосов
/ 07 октября 2011

На самом деле, вам не нужно делать ничего особенного.

По умолчанию реализация XVec2 position() const в XLightSprite скрывает position() из XSprite и действует как переопределение виртуальной функции, определенной в XLightSource.

Если, однако, вы хотите уточнить, что вы хотите переопределить функцию, вы можете добавить объявление использования

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

Обратите внимание, однако, что если position () из XSprite также является виртуальной функцией в том же формате, новая реализация также будет действовать как переопределение позиции в XSprite.

0 голосов
/ 07 октября 2011

Просто добавьте одну строку:

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