ich hab da ein c++ problehm !



  • Ähm... mit Krieger meinte er doch sowas wie "der, der etwas kriegt"



  • na dann wäre mir der zusammenhang was vererbung angeht erst recht nicht klar. die beiden wären ja genau das gegenteil. die beiden könnten höchstens von der gleichen übergeordeten klasse erben, aber davon war ja keine rede.

    cut todo



  • Original erstellt von <GAAADA>:
    dann ist das so , als würdest du "EinPaketButter" von "Joystick" ableiten !

    😃 😃 Das ist ein guter Vergleich.

    Jetzt aber zum Thema. Die public-Vererbung stellt eine "ist-ein" Beziehung dar. Das heisst, dass du einen Hund von Tier ableiten kannst -> Hund ist ein Tier. Einen Dackel kannst du vom Hund ableiten -> Dackel ist ein Hund und dieser wiederum ist ein Tier. Durch diese Beziehungen kann man ganze Ableitungshierarchien erstellen.

    Wie mann vererbt haben ja schon paar Poster vor mit gezeigt und mit einigen mehr oder weniger brauchbaren Beispielen veranschaulicht.

    Ich empfehle dir mal das Buch "C++ in 21 Tagen". Die kostenlose Inet Version [url] http://www.informit.de/books/c++21/data/start.htm [/url]. Da wird die Vererbung sehr gut erklärt.

    Gruß KravenZ

    [ Dieser Beitrag wurde am 31.05.2003 um 14:26 Uhr von KravenZ editiert. ]



  • Hallo!
    Vererbung nutzt man, um sinnvolle Verbindungen und Beziehungen in seinem Programm herzustellen und somit ein Stück weit die Realität zu repräsentieren.

    Beispiel:

    class Mammal           //Basisklasse
    {
    public:
      void Atmen() { /* Code */ }
    };
    
    class Dog : public Mammal  //abgeleitete Klasse
    {
     /* usw */
    }; 
    //Hunde atmen ja auch irgendwie...
    

    Nicht einmal abgeleitete Klassen können private Elemente einer Basisklasse nutzen, daher solltest du in einem solche Fall anstatt "public" "protected" wählen (geschützt).

    Dann gibt es noch virtuelle Vererbung und Mehrfachvererbung usw.
    Das Schlüsselwort "virtual" sagt hierbei nichts anderes als »kann in einer abgeleiteten Klasse überschrieben werden«.

    cu
    BodPa



  • virtual hat eine viel grössere bedeutung.
    Überschreiben kannst du auch so ohne virtual.

    [ Dieser Beitrag wurde am 31.05.2003 um 16:07 Uhr von KravenZ editiert. ]



  • Original erstellt von KravenZ:
    **Überschreiben kannst du auch so ohne virtual.
    **

    nein, nur verdecken



  • Original erstellt von Shade Of Mine:
    nein, nur verdecken

    nein. überschreiben.
    verdecken nennt man das nur wenn man den gleichen namen benutzt, aber im rest der signatur unterschiede auftretten.
    wenn die signatur gleich bleibt ist es überschrieben.



  • @KravenZ
    es tut mir ja leid dir das sagen zu müssen, aber du irrst dich.
    Überschreiben kann man *ausschließlich* virtuelle Methoden.

    Wird eine nichtvirtuelle Elementfunktion in einer abgeleiteten Klasse redefiniert, dann wird dadurch die Elementfunktion der Basisklasse von dieser Funktion überdeckt. Es findet weder eine Überschreibung noch einer Überladung statt.

    Dann gibt es noch virtuelle Vererbung und Mehrfachvererbung usw.
    Das Schlüsselwort "virtual" sagt hierbei nichts anderes als »kann in einer abgeleiteten Klasse überschrieben werden«.

    Das ist natürlich quatsch. Virtuelle Vererbung und virtuelle Memberfunktionen sind zwei unterschiedliche Konzepte. Virtual sagt im ersten Fall nicht "kann in einer abgeleiteten Klasse überschrieben werden" sondern "existiert nur genau einmal auch wenn es mehrere Wege zur virtuellen Basisklasse gibt". Virtuelle Vererbung drückt also "Composition by reference" aus und hat nichts mit Überschreiben von Funktionen zu tun.

    Die public-Vererbung stellt eine "ist-ein" Beziehung dar.

    Das ist zwar richtig, in der Regel aber keine besonders gute Orientierungshilfe. Ein Strauß "ist-ein" Vogel. Es ist trotzdem in vielen Fällen keine gute Idee Strauß von Vogel abzuleiten.
    Das LSP (Liskov-substitution-Principle) ist ein deutlich besserer Ratgeber was die öffentliche Vererbung angeht.
    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Liskov#Answ
    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=DebyCon#Answ

    Die Beispiele hier sind mir auch viel zu sehr datenorientiert. Öffentliche Vererbung sollte in der Regel verhaltens- nicht datenorientiert sein. Vererbung ist schließlich nicht primär ein Mittel für Quelltextwiederverwendung der Basisklasse.

    Oder wie es Herb Sutter so schön sagt:
    "Never inherit publicly to reuse code (in the base class); inherit publicly in order to be reused (by code that uses base objects polymorphically)."

    [ Dieser Beitrag wurde am 31.05.2003 um 17:37 Uhr von HumeSikkins editiert. ]



  • @HumeSikkins
    Ok kann sein dass ich mir etwas falsch gemerkt habe.
    Danke für die Berichtigung.

    Das mit der "ist ein"-Beziehung ist ja auch keine feste Regel, hilft aber oft zur Erkälrung und zur Orientierung. Natürlich kann man das nicht auf alles übertragen.

    [ Dieser Beitrag wurde am 31.05.2003 um 17:46 Uhr von KravenZ editiert. ]

    [ Dieser Beitrag wurde am 31.05.2003 um 17:47 Uhr von KravenZ editiert. ]



  • Es ist trotzdem in vielen Fällen keine gute Idee Strauß von Vogel abzuleiten.

    wenn mans richtig macht, ist das sehr wohl ne gute Idee.. man darf eben keine Dinge die nicht jeder Vogel kann (zum Beispiel "fliegen", darauf hast du wohl auch angespielt) in Vogel einbauen. Mit Vogel<-Fliegvogel<-Adler und Vogel<-Strauss kommt man aber gut hin (wenn mans aufs Fliegen anlegt)



  • Hallo!

    -------
    Original erstellt von HumeSikkins:

    Dann gibt es noch virtuelle Vererbung und Mehrfachvererbung usw.
    Das Schlüsselwort "virtual" sagt hierbei nichts anderes als »kann in einer abgeleiteten Klasse überschrieben werden«.

    Das ist natürlich quatsch. Virtuelle Vererbung und virtuelle Memberfunktionen sind zwei unterschiedliche Konzepte. Virtual sagt im ersten Fall nicht "kann in einer abgeleiteten Klasse überschrieben werden" sondern "existiert nur genau einmal auch wenn es mehrere Wege zur virtuellen Basisklasse gibt". Virtuelle Vererbung drückt also "Composition by reference" aus und hat nichts mit Überschreiben von Funktionen zu tun...
    ------------

    Naja, Stroustrup selber hat meinen kleinen Merksatz in seinem dünnen Büchlein geschrieben. Ich habe jetzt mal angenommen, er hätte Ahnung, aber naja...!

    cu
    BodPa

    [ Dieser Beitrag wurde am 31.05.2003 um 18:21 Uhr von BodPa editiert. ]



  • wenn mans richtig macht, ist das sehr wohl ne gute Idee..

    Super Satz 😃
    Gefällt mir fast so gut wie mein Merksatz "Kaum macht man's richtig, schon funktioniert's".

    Naja, Stroustrup selber hat meinen kleinen Merksatz in seinem dünnen Büchlein geschrieben.

    Ich würde mal behaupten, dass es sich um ein Missverständnis deinerseits handelt. Aber sag mir doch einfach mal die Stelle auf die du dich beziehst.


Anmelden zum Antworten