Frage zu Scott Mayers Effektiv c++ programmieren.



  • Hallo ich denke die meisten kennen das oben angegebene Buch. Ich habe hier ne Frage dazu.

    In Tipp 23 steht ganz am Ende: "Sicher, die Kunden können neue Klassen ableiten, aber abgeleitete Klassen haben keinen Zugriff auf gekapselte (sprich: private) Datenelemente der Basis. Eine solche >>erweiterte Funktionalität<< ist also nur zweiter Klasse."

    Das verstehe ich nun nicht, bzw. ist ein widerspruch für mich. Denn in dem Tipp beschreibt er doch gerade dass Nichtelementfunktionen besser sind da sie keinen Zugriff haben auf private (gekapselte) Objekte haben.

    Oder wie seht ihr das?



  • vonne-proppen schrieb:

    Hallo ich denke die meisten kennen das oben angegebene Buch.

    Aber nicht jeder hat es gerade parat. Leider ist bei deinem Zitat ein großteil des Kontextes verlorengegangen, so dass man um die Frage zu beantworten jetzt erst das Buch hervorkramen müsste.... Gib uns ein wenig mehr infos, worum es grundsätzlich geht.


  • Mod

    Hmm, wo steht dann das? Bei Tipp 23 geht's bei mir um Referenzen als return-Werte.

    Ich sehe auch nicht, wo du da den Widerspruch siehst. Freie Funktionen haben keinen Zugriff auf private Datenelemente. Und auch wenn jemand von meiner Klasse erbt, kann er trotzdem nicht an die privaten Elemente meiner Klasse ran.



  • Ja, du hast leider nur sehr wenig rezitiert. Ich habe das Buch leider zu Hause liegen. Aber wenn man sich das Zitat zweimal durch liest, versteht man es trotzdem.

    Also, es geht darum, das die Ableitung nicht gut ist, weil man ggü. freien Funktionen keinen Vorteil erlangt. Ihm geht es aber nur im die private Daten!

    Bsp.:

    class Base
    {
         int a;
    public:
         void foo();
         void bar();
    };
    

    OK, das a ist private. foo und bar ist public. Jetzt sagt er, das man hier nicht vererben sollte. Sondern eine freie Funktion erstellt:

    void complete(Base &b)
    {
        b.foo();
        b.bar();
    }
    

    Wir haben hier keinen Nachteil, weil wir alles umsetzen konnten, was wir aus Base brauchen. Jetzt würden aber die meisten wohl vererben:

    class MyBase : public Base 
    {
    public:
        void complete() 
        {
               foo();
               bar();
        }
    };
    

    Der Witz ist das ich damit ggü. der freien Funktion keinen Vorteil habe. Ich habe einfach nur vererbt der Vererbung wegen. Und a konnte ich in keiner Variante zugreifen. Auch hat sich das Verhalten von Base durch MyBase nicht geändert.
    Deshalb nennt er MyBase "zweite Klasse"... ähnlich dem Zugabteil "2. Klasse".

    Anders sehe es aus, wenn Base protected Elemente hätte die ich nutzen will! Dann müsste ich vererben, um die protected Funktionen nutzen zu können. Und mit freien Funktionen könnte ich das nicht. Man soll also überlegen, wann man vererbt.


  • Administrator

    SeppJ schrieb:

    Hmm, wo steht dann das? Bei Tipp 23 geht's bei mir um Referenzen als return-Werte.

    Tja, das kommt dann noch dazu. Von der 2. Auflagen zur 3. wurde die Reihenfolge verändert, verschiedene Tipps rausgenommen und auch einige dazugefügt. Tipp 23 in der 3. Auflage handelt von "Prefer non-member non-friend functions to member functions" und ist in der 2. Auflage Item 18.

    Artchi hat das übrigens ganz korrekt erkannt. Wird ganz am Ende von Item 23/18 erwähnt. Meyers hat aber noch zusätzlich was gesagt:
    Nicht alle Klassen können Basisklassen sein.

    Grüssli



  • Achso. Gut vielen Dank.



  • @Dravere
    Jo ok hatte ich nicht bedacht. Ist Auflage 3.

    Meyers hat aber noch zusätzlich was gesagt:
    Nicht alle Klassen können Basisklassen sein.

    Jo. Das ist richtig. Aber das habe ich ja verstanden. Und deshalb auch nicht zitiert.


Log in to reply