Abtrakte Funktion in Ableitung
-
Hallo,
ich habe eine Funktion in einer abstrakten Basisklasse die ich
in der Ableitung überschreiben will, aber im costructor der Basisklasse aufrufen.(g++ / linux)
class a{ protected: virtual void test() = 0; public: a() {test();}; ~ a(); } class b : public a{ protected: void test() {printf("Test");}; public: b(); ~ b(); }Nach meinem Verständniss sollte das kein Problem sein, doch beim Kompilieren
kommt die Fehlermeldung undefinied reference to a::test()Geht das unter C++ im Gegensatz zu Delphi nicht, oder wie ist der richtige Weg?
Gruß
NewBee
-
Im Konstruktor greift polymorphie noch nicht. Selbst wenn die Methode nur virtual und nicht abstract wäre, würde nicht die überschriebene Methode aufgerufen werden.
-> Geht leider nicht in C++.
-
Gnampf.
Danke für die Antwort...
Gibt es im Umkehrschluss also keine andere Möglichkeit als dann für jede Ableitung den Konstruktor zu überschreiben?
Gruß
NewBee
-
NewBee2 schrieb:
Gibt es im Umkehrschluss also keine andere Möglichkeit als dann für jede Ableitung den Konstruktor zu überschreiben?
Jain. Der Konstruktor wird sowieso nicht überschrieben. Der Basisklassenkonstruktor und der abgeleitete Konstruktor werden beide aufgerufen (zuerst die Basisklasse). Jetzt siehst du auch, wieso es nicht möglich ist, aus dem Basisklassenkonstruktor die korrekte abgeleitete Funktion aufzurufen: Der abgeleitete Konstruktor wurde noch gar nicht ausgeführt, das nötige Objekt zum Aufruf der Funktion existiert noch gar nicht.
Es gibt jedoch gewisse Techniken:
http://www2.research.att.com/~bs/bs_faq2.html#virtual-ctorDie wichtige Frage ist: Was möchtest du überhaupt erreichen? Frag nicht nach dem Weg, sondern nach dem Ziel!
-
Die wichtige Frage ist: Was möchtest du überhaupt erreichen? Frag nicht nach dem Weg, sondern nach dem Ziel!
Die Klasse ist quasi ein Lookup-Container für div. berechnete Daten.
Jede abgeleitete Klasse hat eine eigene Rechenvorschrift zum füllen der Matrix/des Contrainers.Ich wollte in jeder Ableitung nur die "Rechenfunktion" überschreiben, die
nach dem Erzeugen automatisch aufgerufen werden sollte.Gruß
NewBee
-
Sehe so zwei Wege:
Die entsprechenden Berechnungen direkt im ctor anstellen. Wenn die Berechnungen sehr kompliziert sind, und idealerweise auf mehrere Funktionen verteilt sind, kannst du auch als ctor parameter ein Objekt übergeben, in dem drinnensteht wie du die Berechnungen anstellst.class a{ public: a(CalculateContens* calc) {calc->calculate;}; ~ a(); }
-
Ich würde mir überlegen, ob Ableitung da wirklich die richtige Lösung ist. Wäre da nicht vielleicht Komposition eher angebracht?