Überladene Methoden und Vererbung?
-
Hi,
hab eine Basisklasse, die lauter überladenen Methoden mit Namen Out() enthält. Mein Plan war nun, dass der Anwender davon eine Klasse ableiten kann, und weitere Out()-Methoden hinzufügt. Und dann kann er seine eigenen und die ererbten Out()-Methoden verwenden.
Dummerweise werden ja aller Wahrscheinlichkeit nach ererbte Methoden ausgeblendet, wenn in der abgeleiteten Klasse Methoden denselben Namen haben. Ich hab mal vor alle betreffenden Methoden in beiden Klassen virtual geschrieben, was auch nicht die Lösung ist. Das Problem dabei ist, dass die Out-Methoden der abgeleiteten Klasse mit großer Wahrscheinlichkeit diejenigen der Basisklasse benutzen müssen.
Was kann ich tun? Ich will auf keinen Fall, dass der Benutzer seine Methoden in der abgeleiteten Klasse anders nennen muss, damit es funktioniert!
Vielleicht weiß ja einer ne Lösung?!?!
Danke.
-
einen superüberblick zu deinem problem bekommst du bei hume
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=oho#Answthema überdecken ganz unten.
achte auf scott meyers ausspruch:
"Never redefine an inherited nonvirtual function".
-
Ok gut, danke für den Link, nur was soll ich jetzt machen?
Das virtual also frei nach Scott Meyers stehen lassen?
Dann kann der Anwender in der abgeleiteten Klasse überladen oder überschreiben.
Und anscheinend kann er sich dann in der abgeleiteten Klasse so auf die gleichnamigen Methoden der Basisklasse beziehen und sie aufrufen:Basisklasse::Out(a,...);
Aber ist das guter Stil? Ansonsten denkt der Compiler ja, die Methode Out()muss im aktuellen Scope, eben der abgeleiteten Klasse sein, wo er sie dann naturgemäß nicht findet.
Das wäre also eine Lösung, ist sie wirklich gut?
-
Hallo,
also virtual oder nicht ändert nichts an dem Problem Verdecken oder nicht (und ich hatte gehofft, dass mein Artikel das eigentlich klar macht).
Wenn du nicht willst, dass deine out-Funktionen der Basisklasse von denen in einer abgeleiteten Klasse verdeckt werden, dann musst du die Basisklassen-Versionen in der abgeleiteten Klasse durch eine using-Deklaration sichtbar machen:class Base { public: ... void out(); void out(int); }; class Derived : public Base { public: using Base::out; // alle Base::out-Versionen in Derived sichtbar machen void out(double) { out(); // Ok: Base::out() } };
-
Habe den Artikel nur überflogen, daher nicht diese Einsicht! Aber vielen Dank für deine Post, war genau das, was ich gesucht habe.