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 IGamePlayerGruß
-
1. Upcasts erfolgen implizit und benötigen kein
static_cast(Zeile 43).
2. Downcasts mittelsstatic_castund 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
CPlayerManagereinenCGamePlayer*zurückzugeben.