Private Vererbung



  • Hallo Forum,

    es sei;

    class B : private A {
    ...
    }
    

    Kann ich dann innerhalb von B den this Zeiger einer Funktion übergeben die ein A erwartet? Das sollte doch gehen!

    Vielen Dank

    Peter



  • Warum probierst dus nicht aus?



  • ----- schrieb:

    es sei;

    class B : private A {
    ...
    }
    

    Kann ich dann innerhalb von B den this Zeiger einer Funktion übergeben die ein A erwartet? Das sollte doch gehen!

    Der this-Zeiger wird an Funktionen implizit übergeben, wenn du den Zugriff auf Funktionen in A durch B meinst.
    Wenn du aber meinst, du kannst einer FUnktion, die ein A explizit erwartet ein B unterjubeln geht das definitiv nicht! Die private-Vererbung macht B nicht zu einem A (außer für als friend deklarierte Funktionen/Klassen), es macht nur Funktionen (public und protected) aus A direkt sichtbar in B.
    Private Vererbung solltest du aber echt nur machen, wenn du nicht B als A ausweisen willst, aber von B aus Zugriff auf den protected-Bereich von A brauchst.
    Für alle anderen Fälle wäre Komposition besser als private-Vererbung:

    class B {
        A a;
    public:
        /** interface goes here */
    };
    


  • // def ist irgendwo anders definiert.
    int def(A objA);
    
    class B : private A {
    int abc() {
    def(this);
    }
    }
    

    Das wollte ich machen. Ich setze es dann um.
    Ok, vielen Dank l'abra d'or 🙂



  • l'abra d'or schrieb:

    Wenn du aber meinst, du kannst einer FUnktion, die ein A explizit erwartet ein B unterjubeln geht das definitiv nicht! Die private-Vererbung macht B nicht zu einem A (außer für als friend deklarierte Funktionen/Klassen)

    Und für B selber eben auch. Soll heißen ein B kann sich selbst (oder ein anderes 😎 als A ausgeben und an Funktionen übergeben, die ein A erwarten. So dass das was ---- vorhat funktioniert. Wobei die Übergabe per value slicing zur Folge hat.


Anmelden zum Antworten