Funktioniert dynamic_cast wirklich für die mehrfache Vererbung?

Ich wollte sehen, ob es möglich ist die Schaffung von "Schnittstellen", Erben Sie, und überprüfen Sie dann, zur Laufzeit, wenn irgendwelche random-Klasse, die diese Schnittstelle implementiert. Dies ist, was ich habe:

struct GameObject {
    int x,y;
    std::string name;

    virtual void blah() { };
};

struct Airholder {
   int oxygen;
   int nitrogen;
};

struct Turf : public GameObject, public Airholder {
   Turf() : GameObject() {
      name = "Turf";
   }

   void blah() { };
};

void remove_air(GameObject* o) {
   Airholder* a = dynamic_cast<Airholder*>(o);
   if(!a) return;
   a->oxygen   = 0;
   a->nitrogen = 0;
};

Nun, es funktioniert. Die Dokumentation sagt, dass es funktioniert, ist das test-Beispiel funktioniert.. Aber auch, es hat nicht kompiliert, bis ich fügte hinzu, eine virtuelle Methode zu GameObject. Die Sache ist die, ich weiß wirklich nicht, ob das feature verwendet werden soll, wie, dass. Was mich wundert ist die Tatsache, dass ich die Deklaration einer virtuellen Funktion für die Klasse bin ich der überprüfung. Aber natürlich, da ist keiner, der Klasse bin ich die Prüfung selbst hat keine virtuellen Funktionen, in der Tat meine ganze code hat nichts mit virtuellen Funktionen, es ist eine ganz andere Herangehensweise.

So, ich denke, meine Frage ist: Wenn das, was ich Tue wirklich funktioniert, warum brauche ich eine virtuelle Funktion zu geben, meine Klasse eine vtable? Warum kann ich nicht erklären, die Klasse "runtime-Typ" oder so etwas ohne virtuelle Funktionen?

  • Ich verstehe, dass dies möglicherweise eher ein learning-übung für Sie, aber können Sie eine Schnittstelle erstellen, die nur rein virtuelle Funktionen und gehen von dort aus.
  • Die Dokumentation sagte, es funktioniert ohne eine virtuelle Funktion? Und warum sagen Sie das test-Beispiel funktionierte, wenn man nicht einmal kompilieren?
  • Auch wenn Airholder hatte, virtuelle Funktionen, würde ich noch nicht in der Lage sein, die überprüfungen durchführen. Ich glaube, du bist nicht das problem zu verstehen.
  • Ich glaube, ich verstehe. Mein Punkt ist, dass dies zu einer komplizierten Lösung. Ich weiß ein wenig über dynamic_cast und RTTI und all das Zeug, aber haben immer fern blieben, weil es schien nicht die beste Lösung für meine Probleme. Vielleicht war ich geworfen von Ihrem Beispiel ist einfacher als das, was Sie wirklich arbeiten. Meine wirkliche Punkt ist zu bevorzugen statische typüberprüfungen und Polymorphismus über alle runtime-Sachen.
InformationsquelleAutor cib | 2011-08-29
Schreibe einen Kommentar