Frage zu Redefinition ?



  • Hallo,
    handelt es sich bei folgenden Code um eine Redefintion einer Methode ?

    Class A{
    		void funktion(x){…}; 
    	};
    
    	class B:public A{
    		void funktion(x){…}; //  
    	};
    

    Was passiert hier genau, bzw. welche Methode existiert in Klasse B (die gibts doch jetzt 2 mal ?). Nennt man das o.g. Beispiel eine Redefinition oder gibt es eine Redefintion nur in Verbindung mit "virtual" ?

    Vielen Dank für Eure Hilfe.
    MfG Karen.



  • Ja, es ist eine Redefinition. Die Funktion aus A wird durch die aus B überlagert.



  • Also Redefintion muss nicht zwangsweise etwas mit "virtual" und "polymorphismus" zu tun haben ?



  • Nein. Es ist aber nicht zu empfehlen eine geerbte, nicht virtuelle Funktion zu redefinieren...



  • Wieso das? Das hängt doch immer vom Anwendungsfall ab. Es gibt schliesslich mehr als nur public Vererbung.



  • Karen schrieb:

    Nennt man das o.g. Beispiel eine Redefinition

    Nein eher nicht. Redefinition wird in der Regel synonym für überschreiben (override) verwendet. Was du hier machst ist aber nicht überschreiben sondern verdecken. Die Funktion der Basisklasse ist nachher nur noch qualifiziert über ein Objekt der abgeleiteten Klasse aufrufbar.

    Zur Wiederholung nochmal die wichtigsten drei Varianten bei der Definition von Funktionen:

    1. Überladen (overloading)
    Man spricht von Überladen, wenn *innerhalb eines Scopes* zwei oder mehrere Funktionen mit dem selben Namen aber unterschiedlichen Signaturen existieren.

    void func();
    void func(int);
    

    2. Verdecken (hiding)
    Man spricht von Verdeckung, wenn in einem inneren Scope eine Funktion existiert, die den selben Namen (aber nicht notwendigerweise die selbe Signatur) hat, wie eine Funktion in einem umschließenden Scope.

    namespace Outer {
        void func();
        namespace Inner {
             void func(int);   
             void gunc()
             {
                  func();   // Error! func(int) verdeckt Outer::func
             }
        }
    }
    

    3. Überschreiben (overriding)
    Man spricht von Überschreibung, wenn eine abgeleitete Klasse eine zu einer *virtuellen* Memberfunktion einer Basisklasse signaturgleiche (bzw. mit kovariantem Rückgabe-Typ) Memberfunktion definiert.

    class Base
    {
    public:
        ...
        virtual void func();
    };
    
    class Derived : public Base
    {
    public:
        /* virtual */ void func();
    
    };
    

    Überladen und Verdecken kann man also sowohl freie- als auch (virtuelle) Memberfunktionen. Überschreiben hingegen nur virtuelle Memberfunktionen.


Anmelden zum Antworten