Невозможно получить доступ к методу базового класса в производном классе - PullRequest
0 голосов
/ 01 июля 2018

У меня есть база class следующим образом:

template<typename aGamePieceBase> class GamePiece : public aGamePieceBase
{
public:
    // Each GamePiece contains a definition of the base class from which it was derived
    typedef aGamePieceBase gamePieceBase

    // Returns this piece's sprite
    virtual sf::Sprite* getSprite()
    {
        return m_pSprite;
    }
protected:
    sf::Sprite* m_pSprite;
}

И производное class:

class Horse : public GameBoard::GamePiece< GameBoard::GamePieceBase >
{
public:
    virtual sf::Sprite* getSprite() override
    {
        // Do stuff
    }
};

Однако мне сообщают об этой ошибке при замедлении Horse::getSprite Функция-член, объявленная с переопределением, не переопределяет член базового класса

Почему getSprite недоступен в Horse?

GamePieceBase выглядит следующим образом:

class GamePieceBase : public GameEventHandler
{
public:
    // Called when the GamePiece has been added to the GameBoard 
    template<typename aTileBase> virtual void onPieceCreate( Tile<aTileBase> *startingLocation ){}
    // Called when the GamePiece has been removed from the GameBoard
    virtual void onPieceRemove(){}
    // Called when the user has selected this GamePiece
    virtual void onPieceSelect(){}
    // Called when the user has de-selected this GamePiece
    virtual void onPieceDeselect(){}
    // Called when this GamePiece has moved on the board
    template<typename originTileBase, typename destinationTileBase> virtual void onPieceMove( Tile<originTileBase>* originTileBase, Tile<destinationTileBase>* pDestinationTile ){}
};

РЕДАКТИРОВАТЬ: Выходной журнал указывает на наличие внутреннего компилятора error, но не дает много подробностей. Я сейчас расследую это

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Проблема была со строкой

typedef aGamePieceBase gamePieceBase

Забытая точка с запятой здесь делает недействительным последующее замедление метода и вызывает странные ошибки в выходных данных компилятора MSCV.

0 голосов
/ 02 июля 2018

Это работает для меня:

class GamePieceBase
{
public:
    // Called when the GamePiece has been added to the GameBoard 
};


template<typename aGamePieceBase> class GamePiece : public aGamePieceBase
{
public:
    // Each GamePiece contains a definition of the base class from which it was derived
//  typedef aGamePieceBase gamePieceBase

    // Returns this piece's sprite
    virtual int getSprite()
    {
        return 0;
    }
protected:

};


class Horse : public GamePiece< GamePieceBase >
{
public:
    virtual int getSprite() override
    {
        return 0;
    }
};

Однако лучше написать:

int getSprite() override

Запись явных virtual, override или final является самодокументируемой и позволяет компилятору обнаруживать несоответствие типов и / или имен между базовыми и производными классами. Однако написание более одного из этих трех является как избыточным, так и потенциальным источником ошибок. C ++ CoreGuidelines C.128

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...