Vererbung und überladen
-
Hallo alle zusammen.
Ich habe eine Verständnissfrage und hoffe das ihr mir helfen könnt. Es geht um eine Klasse, die von einer Elternklasse Getter und Setter Methoden erbt, da diese public sind. So weit so gut.
class basisklasse { public: basisklasse(); ~basisklasse(); void wert(int);//set int wert();//get private: int iwert; };
dazu
#include "base.h" basisklasse::basisklasse() { this->iwert = 123; } basisklasse::~basisklasse() { } void basisklasse::wert(int val) { this->iwert = val; } int basisklasse::wert() { return this->iwert; }
und
class kindklasse : public basisklasse { public: kindklasse(); ~kindklasse(); private: };
Mit dem Hauptprogramm
kindklasse kk; cout << kk.wert() << endl; //get kk.wert(987); //set cout << kk.wert() << endl; //get
bekomme ich auch die Anzeige 123 987.
Jetzt möchte ich in der abgeleiteten Klasse die Setter Funktion neu schreiben und die soll dann die Basis Setter Funktion aufrufen. Also im Header im public Teil noch
void wert(int);
eingefügt und die Funktion in der Quelldatei ergänzt.
void kindklasse::wert(int val) { basisklasse::wert(val * 5); }
**
Hier jetzt die Frage: Warum funktioniert der Befehl im Hauptprogramm** kk.wert(987); noch, aber der Getter ist nicht mehr aufrufbar? (cout << kk.wert() << endl; //get)
Warum meint Visual Studio 2010 mit der Autovervollständigung vom Quelltext, dass es jetzt nur noch eine Funktion namens void kindklasse::wert(int) bei der Kindklasse gibt? Was habe ich übersehen? Kann ich den Getter ggf. in die Kindklasse importieren?Grüße,
Martin
EDIT: merke gerade, dass dies wahrscheinlich besser in "Programmiersprachen --> C++" aufgehoben wäre; @admin wenn nötig bitte verschieben, Dank.
-
class kindklasse : public basisklasse { public: kindklasse(); ~kindklasse(); using basisklasse::wert; void wert(int); private: };
Die ererbten Funktionen sind in einem anderen Sichbarkeitsbereich (Scope). Wird allerdings in
kindklasse
schon eine Funktion mit passendem Namen gefunden, wird nicht weiter in anderen Bereichen "gesucht". Dasusing
holt die ererbten Funktionen in den selben Scope.
-
gab's da nicht auch was von virtual?
-
volkard schrieb:
gab's da nicht auch was von virtual?
Wenn das nicht nur eine Frage war, kannst du das erläutern?
-
Ok, mir war nicht klar, das der Compiler dann nicht weiter nach Funktionen selben Namens sucht.
Habe geradeusing basisklasse::wert;
getestet und es funktioniert hervorragend
+1 für lagalopex. DankeVisual Studio stellt nun auch die beiden Funktionen in dem Popupfenster dar, wenn man mit der Maus über den Funktionsnamen fährt.
Noch eine Nebenfrage: Woher weis der Compiler, wenn in kindklasse steht : using basisklasse::wert , welche Funktion er aus basisklasse nehmen soll? Nimmt er die Funktion wert() oder nimmt er beide mit und überlagert dann die wert(int) Funktion aus basisklasse mit der Funktion aus kindklasse?
Grüße,
Martin
-
martinh schrieb:
Noch eine Nebenfrage: Woher weis der Compiler, wenn in kindklasse steht : using basisklasse::wert , welche Funktion er aus basisklasse nehmen soll? Nimmt er die Funktion wert() oder nimmt er beide mit und überlagert dann die wert(int) Funktion aus basisklasse mit der Funktion aus kindklasse?
Er nimmt alle. Die eine wird danach von deiner Kind-Methode überschrieben.