Normalerweise, wenn Sie die Art der Sache tun, die Sie tun, wird die Base-Klasse einen virtuellen Destruktor haben. Dies ermöglicht die Identifikation des Laufzeittyps.
Sie möchten wahrscheinlich auch struct Derived : public Base
schreiben, einschließlich des Schlüsselworts public
.
Erklärung für den virtuellen Destruktor folgt.
Ein Objekt einer einfachen Klasse, die Klasse ohne virtuelle Methoden, ist nichts als eine Sammlung von Daten im Speicher. Code, der die Adresse eines solchen Objekts hat, kann nicht einfach durch Betrachten des Objekts feststellen, ob das Objekt von der Basis oder vom abgeleiteten Typ ist.
Wenn jedoch der Basistyp über mindestens eine virtuelle Methode verfügt, fügt der Compiler jedem Objekt des Typs einen einzelnen versteckten Zeiger hinzu. Dieser Zeiger zeigt auf eine Tabelle, die unter anderem den Typ des Objekts genau identifiziert, so dass dynamic_cast<>()
und andere polymorphe Operationen auf dem Zeiger möglich sind.
Wenn all dies für Sie neu ist, dann ist hier, was ich empfehle nächste zu versuchen: fügen Sie einen null virtuellen Destruktor virtual ~Base() {}
der Base-Klasse und lesen Sie dann über dynamic_cast<>()
. Als nächstes möchten Sie vielleicht auch die Basis retain()
virtuell machen und dann Derived eine eigene, überschreibende retain()
geben.
Wie auch immer, es sei denn, Sie können gezieltere Ratschläge erhalten, das vorhergehende sollte Ihnen etwas geben, mit dem Sie anfangen können. Viel Glück.
Das ist besser als meine Antwort. Bevorzugen Sie diese. – thb
BTW, der erste Ansatz heißt ["Curiously wiederkehrende Vorlage Muster" (CRTP)] (http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) –