Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kann ein Parent wissen, von welchem Child er aktuell benutzt wird?


WhiteVelvet
2006-08-21, 20:13:11
Ich habe hier ein rein logisches Problem, habe aber zuwenig Erfahrung mit Objekt-Orientierung. Und zwar habe ich 3 Klassen:

Klasse A: Instanziiert Klasse B
Klasse B: Stammt von Klasse C ab
Klasse C: Eine Klasse mit vielen Standardmethoden

Die Klasse B stammt also von C ab, weil sie neben den C-typischen Methoden auch spezielle eigene Methoden besitzt. Jetzt habe ich das Problem, dass Klasse C eine Methode XYZ verwendet, die Klasse B besitzt, weil sie von mal zu mal unterschiedlich ist. So würde eine Klasse D, die auch von C abstammt, eine noch andere Version dieser Methode XYZ haben.

Wie bringe ich C nun bei, dass es die Methode XYZ von z.B. B benutzen soll und ein anderes mal von D? Gibt es sowas (nur hypothetisch) wie child->XYZ() ?

Trap
2006-08-21, 20:28:30
Da ruft man normalerweise eine polymorphe Methode auf (in Java ist das default, in C++ muss man virtual dazuschreiben) und überschreibt die in den erbenden Klassen.

Beispiel in C++
class C {
public:
void doBlub(){
XYZ();
}
virtual void XYZ() {};
}

class B : public C {
public:
virtual void XYZ() { std::cout << "BLA!" << std::endl;}
}

class D : public C {
public:
virtual void XYZ() { std::cout << "GNARZ!" << std::endl;}
}

B b; D d;
b.doBlub(); // gibt BLA! aus
d.doBlub(); // gibt GNARZ! aus
Wenn doBlub() nicht macht außer XYZ aufzurufen kann man es natürlich auch weglassen und XYZ() direkt aufrufen.

Neomi
2006-08-21, 20:36:17
Was du dafür brauchst, sind virtuelle Methoden. Schau einfach mal in deiner Dokumentation nach dem Begriff "virtual", dann solltest du alles nötige dazu finden.

Edit: hoppla, eine Ecke zu spät.

WhiteVelvet
2006-08-21, 21:28:01
Prima, das funktioniert, vielen Dank!

Gast
2006-08-22, 12:57:27
Nur zur Vollständigkeit: Damit auch der richtige Konstruktor aufgerufen hast wenn du Basisklassenpointer löscht aber eigentlich eine abgeleitete Klasse dahinter steckt MUSS der Destruktor virtual sein und wenn du nur "virtual ~foo() {}" hinschreibst, sonst bekommst du dickste Probleme.

Außerdem soll gesagt sein, dass virtuelle Funktionsaufrufe etwas langsamer sind (zusätzliche Indirektion). Das ist aber fast nie relevant.

del_4901
2006-08-22, 13:09:32
der typeid operator kann auch dabei behilflich sein (C++)

Gast
2006-08-22, 21:46:11
Was wiederrum aber nur funktioniert wenn mit RTTI kompiliert wurde, was bei kaum einem Compiler Defaulteinstellung ist...