Frage zum Klassendesign
-
Hallo!
Ich habe eine rein virtuell Basisklasse, in der eine Funktion definiert ist, die als Parameter einen Zeiger auf ein Objekt derselben Klasse erwartet.
Jetzt werden von dieser Klasse andere abgeleitet. Damit die Funktion ort auch funktioniert, müsste jetzt aber auch die Funktion einen anderen Parameter erhalten, also ein Objekt der abgeleiteten Klasse.
Wie mache ich das am Besten?class base { public: virtual void foo() = 0; virtual int bla(base *b); }; class abgeleitet : public base { //hier muss jetzt bla als Argument ageleitet *a erhalten };
Ich könnte die Funktion überladen, oder aber das direkt in base machen (dazu müsste halt "abgeleitet" forward deklariert werden). Ist das eine hässliche Lösung?
Verliert so nicht die Verwendung einer Basisklasse den Sinn, wenn ich die Funktion so nicht in abgeleiteten Klassen verwenden kann?Ist vielleicht ne komische Frage, aber egal...
-
musst du nicht, solange du über den zeiger nur auf die in der Basisklasse deklarierten Methoden zugreifst. Das ist ja das Tolle an Polymorphie, dass ein Objekt der KLasse abgeleitet auch ein Objekt der Klasse base ist und ein Zeiger auf abgeleitet automatisch auch ein Zeiger auf base ist.
class abgeleitet : public base { virtual int bla(base* b) { b->foo(); //nur als beispiel return 5; }; }; int main() { abgeleitet a; abgeleitet a2; int i = a.bla(&a2); //ruft a2.foo() auf (beispiel) };
[/cpp]
-
Danke!
Das ist ja echt genial!
-
Ich habe eine rein virtuell Basisklasse
<Terminologie>Du hast keine rein virtuelle Basisklasse, da es soetwas nicht gibt. Es gibt virtuelle Basisklassen (Klassen von den virtuell geerbt wird) und rein virtuelle Methoden, nicht aber rein virtuelle Basisklassen. </Terminologie>
-
virtuelle Methoden
<Terminologie>Es gibt keine virtuellen Methoden, sondern nur virtuelle Memberfunktionen</Terminologie>
-
<> schrieb:
virtuelle Methoden
<Terminologie>Es gibt keine virtuellen Methoden, sondern nur virtuelle Memberfunktionen</Terminologie>
Da hast du strenggenommen natürlich recht. Methode ist der allgemeine OOP-Begriff für die Implementation einer Nachricht die ein Objekt versteht. Die Dinger heißen in C++ aber in der Tat Memberfunction. Wobei ich nicht verstehe, warum man das Halbherzig mit Memberfunktion statt einfach komplett in Elementfunktion übersetzt.
-
<> schrieb:
virtuelle Methoden
<Terminologie>Es gibt keine virtuellen Methoden, sondern nur virtuelle Memberfunktionen</Terminologie>
Genau! Synonyme auf den Scheiterhaufen!