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 Klasse parent einen virtuellen Destruktor?

    Ich sehe leider auch nicht gerade eine Möglichkeit ausser Copy&Paste, die Methode in parent ist schliesslich fix. Gibt es keine sinnvolle Aufteilung wie z.B. die folgende (evtl. mehrere kleinere Aufrufe statt do_big_actions() )? Greift big_function() auf private Member zu?

    void parent::big_function()
    {
        do_big_actions();
        helper();
    }
    

    @ daersc: Er will parent nicht 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.


Anmelden zum Antworten