in Klassen Eltern-Funktion durch Kind ersetzten?
-
hi,
ich möchte eine Erweiterung zu einem Softwareprojekt schreiben. Den offiziellen Code möchte ich daher wenn möglich aus Gründen der Wartbarkeit nicht umschreiben. Ich habe mein Problem mit dem nachstehenden Code skizziert: die Klasse parent soll nicht verändert werden, ich habe eine abgeleitete Klasse child implementiert, die einige Erweiterungen zu parent hinzufügt. Den Nutzer wählt dann aus, die child-Klasse verwenden zu wollen. Wenn nun aber jemand die big_function() aufruft, werden im Laufe sehr vieler Codezeilen einige Funktionen, wie zB die helper() aufgerufen. Ich möchte nun die parent::helper() durch child::helper() ersetzen. Leider ruft die parent::big_function() auch die parent::helper() auf, und nicht die der abgeleiteten child-Klasse. Gibt es eine andere Lösung, als den langen Code von parent::big_function() per copy-and-paste in meine child-Klasse zu übernehmen, um die helper-Funktion zu ersetzen, ohne parent zu ändern?
#include <iostream> using namespace std; class parent { public: void helper() {cout<<"parent helper"<<endl;} void big_function() {cout<<"parent big_function"<<endl; helper();} void other_functionallity(); }; class child : public parent { public: void helper() {cout<<"child helper"<<endl;} }; int main() { child c; c.big_function(); return 0; }dankbar für Anregungen,
Lars
-
class parent { public: // Stichwort: virtuelle Methoden virtual void helper() {cout<<"parent helper"<<endl;} void big_function() {cout<<"parent big_function"<<endl; helper();} void other_functionallity(); };Edit: Oh sorry - hab überlesen, dass du Parent nicht ändern wolltest...
-
Da
parent::helper()offensichtlich nicht virtuell ist, scheint die Klasse wohl eher nicht für Vererbung vorgesehen zu sein (oder zumindest nicht, sodass diese Methode überschrieben wird). Besitzt die Klasseparenteinen virtuellen Destruktor?Ich sehe leider auch nicht gerade eine Möglichkeit ausser Copy&Paste, die Methode in
parentist schliesslich fix. Gibt es keine sinnvolle Aufteilung wie z.B. die folgende (evtl. mehrere kleinere Aufrufe stattdo_big_actions())? Greiftbig_function()auf private Member zu?void parent::big_function() { do_big_actions(); helper(); }@ daersc: Er will
parentnicht verändern.
-
Danke für die Antworten. Letztlich wird es sinnvoller sein, die Methoden als virtuell zu deklarieren. Der Wartungsaufwand ist sorum deutlich geringer. - Darüber reden hilft

edit: auch wenn das leider ausnahmsweise den OriginalCode verändert
thx,
Lars
-
Falls die Klasse nicht polymorph konzipiert ist: Vergiss nicht, den Destruktor virtuell zu machen, sonst erhältst du unter Umständen undefiniertes Verhalten.