Erhalten abgeleiteten Typ über Basisklasse virtuelle Funktion

Ich versuche dem abgeleiteten Typ eines Objekts über eine Basisklasse virtuelle Funktion. Ich habe dies geschrieben, die nicht kompilieren:

struct base {
  virtual base& get_this() {
    return *this;
  }
};

struct derived : base {
  virtual derived& get_this() override {
    return *this;
  }

  void fn();
};


int main () {
  base* pd = new derived();
  derived& x = pd->get_this(); /*ERROR*/
  x.fn();
  return 0;
}

... geben mir eine Fehlermeldung: ich kann nicht initialisiert werden ein derived& aus einer base. Da get_this ist virtuell, warum pd->get_this() Gegenzug eine base& statt einer derived&? Vielen Dank im Voraus!

EDIT:

Danke an alle für Ihre hilfreichen Antworten und Entschuldigung für meine späte Antwort. Sollte ich angegeben habe in dem ursprünglichen Beitrag, ich bin auch daran interessiert, eine Lösung für mein problem eher, als nur herauszufinden, warum die oben genannten nicht kompilieren. Mein Hauptproblem ist, dass fn ist einzigartig in der derived Klasse und kann nicht aufgerufen werden, über die Basis-Klasse. Mithilfe wirft sicher löst das problem, aber ich hasse das schreiben von code mit if -, else-Konstrukte, nur um die richtige Art (auch Scott Meyers abraten wirft :)) . Die Antworten scheinen darauf hinzudeuten, dass die casts sind der Weg zu gehen, die in einer Art und Weise ist zumindest beruhigend, dass ich nicht vernachlässigen, eine "elegante" Lösung zu meinem problem. Nochmals vielen Dank!

  • Gelöscht meine Antwort, aber ich glaube immer noch, die OP wird es besser mit einem einfachen dynamic_cast wird eine gute Lösung für den Anwendungsfall beschrieben. Niemand erwähnte dies in die Antworten, und die Art und Weise Kovarianz unterstützt in C++ löst nicht die OP das primäre problem.
  • Gut, ja, man könnte (sollte) gerade entfernt oder verändert der umstrittene Satz, der rest ist spot-on und eine gute Antwort. Jetzt haben Sie weggeworfen, das Kind mit dem Bade aus.
  • Gab noch eins (ohne die wählerisch Worte). Zumindest hast du Recht: downvote-rate war weniger als Ruf gewinnen an diesem Punkt. Aber ich bin immer nervös auf downvotes, und die Erfahrung zeigt, dass Sie nie zurückgenommen werden, auf entsprechend bearbeitet Antworten.
InformationsquelleAutor linuxfever | 2013-10-21
Schreibe einen Kommentar