Interface <-> Klasse - Rückgabe?



  • Hallo.
    Ist folgendes (laut Standard) erlaubt?

    class IBasePlayer
    {
    public:
        virtual std::string GetName() const = 0;
    };
    
    class IGamePlayer : public IBasePlayer
    {
    public:
        virtual int GetKills() const = 0;
    };
    
    class CGamePlayer : public IGamePlayer, public IBasePlayer
    {
    public:
        virtual std::string GetName() const
        {
            return this->m_strName;
        }
    
        virtual int GetKills() const
        {
            return this->m_iKills;
        }
    
    private:
        std::string m_strName;
        int m_iKills;
    };
    
    class IPlayerManager
    {
    public:
        virtual IBasePlayer *GetPlayer(std::string strName) const = 0;
    };
    
    class CPlayerManager : public IPlayerManager
    {
    public:
        virtual IBasePlayer *GetPlayer(std::string strName) const
        {
            CGamePlayer *pPlayer = new CGamePlayer(strName);
            return static_cast<IBasePlayer*>(pPlayer);
        }
    };
    
    // ist dies valid? und sind dann auch gefahrlos alle Funktionen von CGamePlayer aufrufbar?
    CGamePlayer *pPlayer = static_cast<CGamePlayer*>(PlayerManager->GetPlayer("Heinz"));
    std::string strName = pPlayer->GetName(); // von IBasePlayer
    int iKills = pPlayer->GetKills(); // von IGamePlayer
    

    Gruß



  • 1. Upcasts erfolgen implizit und benötigen kein static_cast (Zeile 43).
    2. Downcasts mittels static_cast und der darauffolgende Zugriff sind definiert, wenn der dynamische Typ mit dem Zieltypen des Casts übereinstimmt.

    Anders gesagt: Dein Beispiel ist erlaubt. Ob du den Downcast wirklich brauchst und sich das nicht schöner lösen lässt, ist eine andere Frage. Zum Beispiel könntest du kovariante Rückgabetypen ausnutzen, um in CPlayerManager einen CGamePlayer* zurückzugeben.


Anmelden zum Antworten