Virtual mal so, mal so...
-
Hi everyone
Folgendes Problem: Klasse C erbt von Klasse B, welche selbst von Klasse A abgeleitet ist.
Die Subklassen B und C haben je eine virtuelle Funktion read().
In meinem Projekt existieren sehr viele Funktionen, die einen Pointer des Typs A als Parameter entgegen nehmen, welcher auf ein B oder C Objekt zeigt (Polymorphismus sei dank). Diese Funktionen rufen dann die entsprechende read-Funktion des B oder C-Objekts auf, je nachdem, um was für ein Objekt es sich handelt.
Für die meisten Funktionen in meinem Hauptprogramm ist dieses Verhalten absolut perfekt. Nun benötige ich für ein letztes Feature allerdings die Möglichkeit, mit einem Pointer auf ein C-Objekt dessen read-Funktion der B-Klasse aufzurufen.
Nach meinem Verständnis sollte das ja eigentlich möglich sein, denn C erbt ja von B. Nur weiss ich leider nicht, wie ich das mit einer virtuellen Funktion machen soll.
Thx schon 'mal für eure Antworten und greeetz
Kessi
-
Ruf die Methode direkt auf, statt Polymorphie zu benutzen.
Das geht so:
#include <iostream> using std::cout; struct A { virtual void print() const = 0; }; struct B : A { virtual void print() const { cout << "\tB::print()\n"; } }; struct C : B { virtual void print() const { cout << "\tC::print()\n"; } }; int main() { C obj; A& a = obj; B& b = obj; C& c = obj; cout << "Calling obj with reference to A: "; a.print(); cout << "Calling obj with reference to B: "; b.print(); cout << "Calling obj with reference to C: "; c.print(); cout << "Calling obj with reference to B and B::print(): "; b.B::print(); cout << "Calling obj with reference to C and B::print(): "; c.B::print(); }Du musst natürlich wissen, dass es "mindestens" ein B ist, also mindestens eine Referenz/Pointer auf B haben mit dem du das Objekt ansprichst. Aber laut deiner Formulierung ist das ja der Fall.
-
Hey, nicht schlecht, das wird mir sicher noch nützlich sein

Klappt das auch "nach unten"? Meine Referenz ist nämlich vom Typ der Basisklasse A...
-
Nein, hab ich doch extra dazu geschrieben.
Aber wenn du weißt, dass es "mindestens" ein B ist, dann kannst du einen downcast durchführen:
C c; A& a = c; B& b = dynamic_cast< B& >( a );Wenn es nicht klappt, dann wird eine std::bad_cast exception geworfen. Wenn a ein Zeiger ist, dann wird ein NULL-Zeiger zurückgegeben.
-
Yeah, danke Mann! Es hat geklappt!
Das war ja fast zu einfach, um wahr zu sein
.Dieses Forum rockt!!!
Schön' Abend noch und greeetz
Kessi