Sichtbarkeit von Methoden / Variablen einer Basisklasse in abgeleiteten Klassen ändern



  • Hallo,

    welche Möglichkeiten gibt es, die Sichtbarkeit (public, protected, private) einer Methode / Variable der Basisklasse in der abgeleiteten Klasse zu überschreiben?

    Ich kann ja neben einer public-Vererbung auch protected / private erben und die Sichtbarkeit entsprechend hochstufen. Geht das auch für einzelne Elemente? Das heißt, dass ich ein öffentliches Element der Basisklasse in der abgeleiteten Klasse private mache oder umgekehrt?



  • Man kann die Sichtbarkeit enschränken, aber nicht erhöhen.

    Für einzelne Elemente geht das allerdings nicht. Das macht aber in den meisten Fällen auch keinen Sinn, sondern ist eher ein Designfehler. Wenn Du die Sichtbarkeit von irgendetwas in einer abgeleiteten Klasse einschränkst, brichst Du damit die "Ist ein"-Beziehung auf:
    Eine Klasse, die in ihrer Basis irgendetwas bestimmtes repräsentiert, sollte das auch in Ihrer Ableitung repräsentieren. Hinzu kommen dann noch Erweiterungen.
    Dies ist aber nicht mehr der Fall, wenn mit der Abgeleiteten Klasse plötzlich irgendwas nicht mehr geht, was mit der Basisklasse noch funktioniert hat.

    Edit:
    Der erste Satz stimmt so nicht so ganz, man kann die Sichtbarkeit bei protected oder private Vererbung für einzelne Member wieder erhöhen:

    class A
    {
    public:
        int a;
    };
    
    class B : private A
    {
    public:
        //macht A::a wieder public
        using A::a;
    };
    

    oder einschränken:

    class A
    {
    public:
        int a;
    };
    
    class B : public A
    {
    private:
        using A::a;
    };
    

    Das ist aber nicht so gut, weil, siehe oben. 😉


Anmelden zum Antworten