Aufruf überladener Methode der Basisklasse



  • Hallo!

    Ich habe ein Problem.
    In der Basisklasse "bank" gibt es eine Methode mit gleichem Namen und gleichem Aufruf wie in der abgeleiteten Klasse "konto".

    #ifndef _KONTO_HPP_
    #define _KONTO_HPP_
    
    class bank
    {
    public:
    	bank(string name);
    	void ausgeben();
    protected:
    	string name;
    private:
    };
    
    class konto : protected bank
    {
    public:
    	konto(int startguthaben, string bankname);
    	konto operator+(konto&);
    	void abheben(int betrag);
    	void ausgeben();
    
    protected:
    
    private:
    
    int k;
    
    };
    
    #endif
    

    Hier noch die zugehörige cpp

    #ifndef _KONTO_HPP_
    #define _KONTO_HPP_
    
    class bank
    {
    public:
    	bank(string name);
    	void ausgeben();
    protected:
    	string name;
    private:
    };
    
    class konto : protected bank
    {
    public:
    	konto(int startguthaben, string bankname);
    	konto operator+(konto&);
    	void abheben(int betrag);
    	void ausgeben();
    
    protected:
    
    private:
    
    int k;
    
    };
    
    #endif
    

    Probleme entstehen in der main, wenn ich mit deklariertem Konto k1 aufrufe:
    "k1.bank::ausgeben();"

    der compiler meldet dann: "bank ist eine nicht erreichbare Basis von konto"

    Ich suche schon seit einigen Stunden nach einer Lösung, kann aber mein Problem nur mäßig in Worte fassen.



  • Nimm bitte in Zukunft die [cpp]- anstelle der [code]-Tags, da gibt es Syntaxhighlighting. 😉

    althippie schrieb:

    In der Basisklasse "bank" gibt es eine Methode mit gleichem Namen und gleichem Aufruf wie in der abgeleiteten Klasse "konto".

    Daran gefallen mir zwei Dinge nicht. Erstens ist es fragwürdig, ein Konto von einer Bank abzuleiten. Ist ein Konto eine Bank? Wohl eher nicht. Mach darum separate Klassen und benutze Konto in Bank als Membervariable. Das zweite ist das Wort "Aufruf". Du meinst wohl eher Funktionstyp (Signatur und Rückgabetyp der Funktion). Aufruf sagt man eher beim Aufrufen der Funktion. 🙂

    Dein Problem besteht darin, dass du versuchst, über die abgeleitete Klasse auf eine Memberfunktion der Basisklasse zuzugreifen. Diese wurde aber als protected vererbt, also sind deren Member protected . Aber normalerweise besteht sowieso kein Anlass zum expliziten Aufrufen einer Basisklassenfunktion - welchen Sinn hätte sonst die Funktion in der abgeleiteten Klasse?

    Den letzten Absatz habe ich nur geschrieben, damit du den Fehler erkennst und ihn in anderen Situationen nicht mehr machst. Aber wie ich anfänglich erwähnt habe, solltest du konto nicht von bank ableiten, das sind zwei eigenständige Klassen!



  • hiho

    das liegt daran, dass du eine protected Vererbung machst,
    und du somit nur innerhalb der klasse "bank" auf die Funktion "ausgeben" der klasse "konto" zugreifen kannst,
    und nicht von außerhalb.

    D.h. du müsstest eine public Vererbung machen.

    MFG Dweb



  • Dweb schrieb:

    D.h. du müsstest eine public Vererbung machen.

    Nein, keine Vererbung. 🙂



  • Geil man, danke man.

    KLappt super!



  • althippie schrieb:

    KLappt super!

    Hast du meine Einwände berücksichtigt? Wenn nicht, brauchst du dich nicht zu wundern, falls du früher oder später auf erhebliche Designprobleme stossen wirst. Nur so nebenbei...



  • Ich muss mich Nexus da voll und ganz anschliessen. Du hast die Grundzüge der OO noch nicht durchdrungen. Hier liegt eine "hat ein" Beziehung vor, d.h. ein Konto ist das Attribut einer Bank und damit Membervariable der Klasse 'Bank'. Vererbung erfordert immer eine "ist ein" Bezeihung. Siehe auch http://de.wikipedia.org/wiki/Vererbung_(Programmierung)


Anmelden zum Antworten