[erledigt]Vererbung von privaten Membervariablen



  • Hallo,

    ich bringe mir gerade die Vererbung von Klassen bei. So weit läuft das auch ganz gut, jedoch stehe ich beim Experimentieren vor einem kleinem Problem. Ich möchte gerne private Membervariablen vererben und mit denen dann innerhalb von Memberfunktionen arbeiten. Jedoch kann ich nicht einfach so auf private Membervariablen zugreifen und wollte fragen ob es möglich sei, private Membervariablen in einer anderen Klasse frei zu verwenden. Kleines Beispiel:

    class c1
    {
    private:
        int i;
    
    public:
        void ini () { i = 10; }
    
    };
    
    class c2 : private c1
    {
        void ini () { j = 10;
                      i = 5; } // <= funktioniert nicht! Kein Zugriff auf private Membervariablen!
    };
    

    Um die Frage kurz zu formulieren: Ist es möglich vererbte private Membervariablen frei zu verwenden, oder kann ich mir das aus dem Kopf hauen?

    Noch kleine Frage am Rande: Wenn man statt class c2 : private c1 einfach class c2 : c1 schreibt, heißt das, dass die ganze Klasse vererbt wird? Also public, private und protected?

    Danke schon im Voraus für Antworten.


  • Mod

    1. class c2 : c1 ist identisch zu c2 : private c1
    2. Es wird immer die "ganze Klasse" vererbt. public, protected und private geben nur an, wie die member der Basisklasse von dieser Klasse aus gesehen werden. Zweideutiger Satz, lies am besten:
    http://www.parashift.com/c++-faq-lite/private-inheritance.html#faq-24.6
    3. Die Veerbung private, protected, public, sagt also nichts über die Zugriffsrechte innerhalb der abgeleiteten Klasse. Es sagt nur etwas aus, wie diese Member der Basisklasse nach außen hin von in abgeleiteten zu sehen sind. (s.o.)
    4. Wenn ein Member private ist, dann heißt das eben private. Außer es gibt einen public/proteced Getter/Setter



  • 1. class c2 : c1 ist identisch zu c2 : private c1

    Danke habe verstanden. D.h., dass es aber auch identisch mit class c2 : public c1 ist, oder ist es nur mit private identisch? Glaube nicht, denn normalerweise heißt es ja in einer Klasse so, dass wenn man kein public, private oder protected mit angibt, so ist es ja automatisch public.

    2. Es wird immer die "ganze Klasse" vererbt. public, protected und private geben nur an, wie die member der Basisklasse von dieser Klasse aus gesehen werden. Zweideutiger Satz, lies am besten:
    http://www.parashift.com/c++-faq-lite/private-inheritance.html#faq-24.6

    Danke für den Link - werde es im Laufe des Tages noch überarbeiten.

    3. Die Veerbung private, protected, public, sagt also nichts über die Zugriffsrechte innerhalb der abgeleiteten Klasse. Es sagt nur etwas aus, wie diese Member der Basisklasse nach außen hin von in abgeleiteten zu sehen sind. (s.o.)

    Okay, diesen Satz habe ich jetzt nicht so recht verstanden. Doch! Ich habe jetzt aber wenigstens verstanden, dass die Vererbung nichts über die Zugriffsrechte innerhalb der abgeleiteten Klasse sagt 😉
    Was bedeutet s.o. ?

    @Martin, danke für die Erklärungen .


  • Mod

    Minispiri schrieb:

    1. class c2 : c1 ist identisch zu c2 : private c1

    Danke habe verstanden. D.h., dass es aber auch identisch mit class c2 : public c1 ist, oder ist es nur mit private identisch? Glaube nicht, denn normalerweise heißt es ja in einer Klasse so, dass wenn man kein public, private oder protected mit angibt, so ist es ja automatisch public.

    Nein! Wenn man keinen Access-Modifier angibt ist es automatisch private:
    http://msdn.microsoft.com/en-us/library/chsw0hdc(VS.80).aspx
    Zitat:
    http://msdn.microsoft.com/en-us/library/chsw0hdc(VS.80).aspx
    After the tag (name) for the class, a colon appears followed by a list of base specifications. The base classes so named must have been declared previously. The base specifications may contain an access specifier, which is one of the keywords public, protected or private. These access specifiers appear before the base class name and apply only to that base class. These specifiers control the derived class's permission to use to members of the base class. See Member-Access Control for information on access to base class members. If the access specifier is omitted, the access to that base is considered private.

    Minispiri schrieb:

    Okay, diesen Satz habe ich jetzt nicht so recht verstanden. Doch! Ich habe jetzt aber wenigstens verstanden, dass die Vererbung nichts über die Zugriffsrechte innerhalb der abgeleiteten Klasse sagt 😉
    Was bedeutet s.o. ?

    Richtig: Für die Rechte auf die Member in der Klasse haben diese access-modifier keinen Einfluss.

    s.o. == Siehe oben! Ich meinte damit den Link und die Errklärung.



  • Danke für die Hilfe.

    Habe jetzt so ziemlich alles verstanden und habe mich jetzt schonmal für das nächste Kapitel meines Buches "Klassen" vorbereitet.

    Thread erledigt 😉


Anmelden zum Antworten