basisklassen methode überladen



  • ich hab eine basis- und mehrere abgeleitete klassen. in der basis sowie in den abgeleiteten klassen gibt es 1 methode die bei allen gleich ist. je nachdem welche klasse ich instanziere kommt ein anderer text aus der jeweiligen abgeleiteten klasse... aber der text aus der basisklasse soll auch immer kommen ..

    einfacher beispiel code:

    #include <iostream>
    class Basis
    {
        public:
               void methode()
               {
                    cout << "ich komm aus der basisklasse" << endl;
               }
    };
    
    class abgeleitet : public Basis
    {
        public:
               //using Basis::methode;
               void methode()
               {
                    cout << "und ich aus der abgeleiteten klasse" << endl;
               }
    };
    
    void main(void)
    {
        abgeleitet a;
        a.methode();
    }
    

    so die ausgabe kommt von der abgeleiteten klasse. aber ich will noch die ausgabe aus der basisklasse.
    dh. ausgabe soll so aussehen:
    "ich komm aus der basisklasse
    und ich aus der abgeleiteten klasse"

    ich hab da schon was mit "using" usw im forum gelesen .. kommt aber immer kompilierungsfehler

    ("19 c:\test.cpp cannot adjust access to `void Basis::methode()' in `class abgeleitet'
    16 c:\test.cpp because of local method `void abgeleitet::methode()' with same name)

    <-- heisst das in c++ geht sowas nicht <-- brauchen die methoden unterschiedliche übergabetypen ..?



  • Wenn du den text aus deiner Basisklasse sehen willst dann musst du methode() der Basisklasse natürlich auch aufrufen. etwa so

    class abgeleitet : public Basis
    {
        public:
               void methode()
               {   Basis::methode();
                    cout << "und ich aus der abgeleiteten klasse" << endl;
               }
    };
    

    Kurt



  • das sollte funktionieren:

    class abgeleitet : public Basis
    {
        public:
               void methode()
               {
                    Basis::methode();
                    cout << "und ich aus der abgeleiteten klasse" << endl;
               }
    };
    

    // Edit: argh, zu spät. 🙂



  • ich kann natuerlich in der abgeleiteten klasse ein obj der basisklasse instanzieren und damit die methode aufrufen.

    void methode()
               {    Basis b;
                    b.methode();
                    cout << "und ich aus der abgeleiteten klasse" << endl;
               }
    

    trotzdem wuerd mich es interesssieren wieso es auf die andere art nicht geht .. da ich leider keine ahnung von cpp hab 😞



  • huch so schnelle antoworten...

    danke danke funzt natuerlich



  • Tust du aber mit Basis::methode nicht
    das Basis:: ändert lediglich den Namensraum auf die Basis ab,
    somit sind Methoden sichtbar, welche evtl.
    in der Abgeleiteten Klasse überdeckt sind.



  • Du solltest bedenken, das Du ohne virtual, wie phlox81 schon sagt, die Basismethode nur überschattest/überdeckst und nicht überschreibst. Das heißt, dass wenn der Zugriff über die Basisklasse erfolgt (Polymorphie) nur die Methode der Basisklasse aufgerufen wird. Hier ein Beispiel, um den Unterschied deutlich zu machen:

    #include <iostream>
    
    using namespace std;
    
    class AbstrakteBasis
    {	
    public:		
    	void ausgabe() const
    	{
    		cout << "ich komm aus der basisklasse" << endl;
    		zusatz();
    	}
    protected:
    	virtual void zusatz() const = 0;
    };
    
    class Ableitung1 : public AbstrakteBasis
    {
    protected:	
    	virtual void zusatz() const
    	{
    		cout << "und ich aus der ersten abgeleiteten klasse und ich ueberschreibe \"zusatz\"" << endl;
    	}
    };
    
    class Ableitung2 : public Ableitung1
    {
    public:
    	void ausgabe() const
    	{
    		AbstrakteBasis::ausgabe();
    		cout << "und ich ueberschatte \"ausgabe\"" << endl;
    	}
    
    protected:	
    	virtual void zusatz() const
    	{
    		Ableitung1::zusatz();
    		cout << "und ich aus der zweiten abgeleiteten klasse  und ich ueberschreibe \"zusatz\"" << endl;
    	}
    };
    
    void ausgabe(const AbstrakteBasis &b)
    {
    	b.ausgabe();
    }
    
    int main()
    {
    	Ableitung1 a1;
    	Ableitung2 a2;
    
    	a1.ausgabe();	
    	cout << endl;
    
    	a2.ausgabe();
    	cout << endl;
    
    	ausgabe(a1);
    	cout << endl;
    
    	ausgabe(a2);
    
    	cin.get();
    }
    

Anmelden zum Antworten