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". Das using 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?



  • @lagalopex

    Ok, mir war nicht klar, das der Compiler dann nicht weiter nach Funktionen selben Namens sucht.
    Habe gerade

    using basisklasse::wert;
    

    getestet und es funktioniert hervorragend 😃
    +1 für lagalopex. Danke 👍

    Visual 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.


Anmelden zum Antworten