Vererbungsstruktur



  • Hi zusammen,

    ich habe mal dieses Tutorial durchgegangen und es tauchen bei mir einige Fragen auf: http://tutorial.schornboeck.net/vererbung.htm

    Dabei habe ich eine Klasse Vogel und eine Klasse Singvogel, die vom Vogel erbt.
    D.h. ich habe folgende Struktur:

    Vogel.h:

    class Vogel
    {
    	public:
    		void fliege();
    };
    

    Vogel.cpp:

    #include "Vogel.h"
    #include <iostream>
    void Vogel::fliege()
    {
    	printf("Der Vogel fliegt!");
    }
    

    Singvogel.h:

    #include "Vogel.h"
    class Singvogel : public Vogel
    {
    	public:
    		void sing();
    
    };
    

    Singvogel.cpp:

    #include "Singvogel.h"
    #include <iostream>
    void Singvogel::sing()
    {
    	printf("Der Singvogel singt!");
    }
    

    Hauptprogramm:

    #include "Vogel.h"
    #include "Singvogel.h"
    int main()
        {
          Vogel vogel;
          vogel.fliege();
    
          Singvogel singvogel;
          singvogel.fliege();
          singvogel.sing();
        }
    

    Nun habe ich noch folgende Fehlermeldung, die ich so nicht ganz nachvollziehen kann. Beide in Vogel.h:
    Previous definition of class Vogel
    Redefinition of class Vogel

    Habe ich da etwas an den includes falsch gemacht?
    Wäre nett, wenn mir jemand einen Tipp geben könnte.

    Gruß



  • Du hast die Klasse mehrfach definiert, da du sie im Hauptprogramm sowohl über "Vogel.h" als auch über "Singvogel.h" indirekt inkludierst.

    Include Guards stellen eine Lösung dar, such mal danach...



  • Sauber. Vielen Dank für den Hinweis. Funktioniert super.



  • Aber wieso eigentlich

    printf("Der Vogel fliegt!");
    

    ?

    wie wärs mit std::cout ?

    bb



  • Haha, ist ein Pinguin auch ein Vogel, obwohl er nicht fliegen kann?



  • knivil schrieb:

    Haha, ist ein Pinguin auch ein Vogel, obwohl er nicht fliegen kann?

    Lt. Definition können Pinguine fliegen. Da sie die gleiche Technik anwenden, wie Vögel beim Fliegen, können sie also auch fliegen - nur eben unter Wasser fliegen...

    bb



  • Jetzt weiß ich auch endlich was Fliegenfischen bedeutet!



  • knivil schrieb:

    Haha, ist ein Pinguin auch ein Vogel, obwohl er nicht fliegen kann?

    Wer sagt denn, dass Pinguine für sein System relevent sind?



  • Tachyon schrieb:

    knivil schrieb:

    Haha, ist ein Pinguin auch ein Vogel, obwohl er nicht fliegen kann?

    Wer sagt denn, dass Pinguine für sein System relevent sind?

    Wer behauptet denn, das sie nicht relevant sind. Btw. ging es darum, die Maengel von Vererbung und den Weg, den er eingeschlagen hat, aufzuzeigen ... Es ist das Ellipse-Kreis-Problem (siehe parashift C++-FAQ-lite).

    PS: Nein Pinguine koennen nicht fliegen, auch nicht unter Wasser. Das nennt man schwimmen. Wenn ich meine Arme hin und her bewege und irgendwelche Techniken anwende, dann fliege ich noch lange nicht (was fuer ein Schwachsinn).





  • knivil schrieb:

    Btw. ging es darum, die Maengel von Vererbung und den Weg, den er eingeschlagen hat, aufzuzeigen ... Es ist das Ellipse-Kreis-Problem (siehe parashift C++-FAQ-lite).

    Wobei oft vergessen wird, dass dieses Problem nur Klassen betrifft, die veränder-Methoden bereitstellen. Ein immutable Kreis kann super von einer immutable Ellipse erben.



  • knivil schrieb:

    Wer behauptet denn, das sie nicht relevant sind. Btw. ging es darum, die Maengel von Vererbung und den Weg, den er eingeschlagen hat, aufzuzeigen ... Es ist das Ellipse-Kreis-Problem (siehe parashift C++-FAQ-lite).

    Ich sehe hier aber keine Pinguine. Daher sind Pinguine für das System wohl auch nicht relevant. Das ist etwas anderes als bei Deinem parashift C++-FAQ-lite-Beispiel, wo das Problem konkret besteht.



  • Diese ganzen Kreis/Ellipse und Pinguin/Vogel Problematiken entstehen nur dann, wenn man für das Problem das das Programm lösen soll die falschen Abstraktionen anwendet. Wenn sich mein Programm ausschließlich mit fliegenden Vögeln beschäftigt (sei es als physikalischer Simulator für fliegende Objekte oder sonstetwas in der Art) dann ist es legitim, die Klasse "Vogel" mit der Methode "fliegen()" auszustatten. Wenn man dagegen mit der biologischen Klasse der Aves zu tun hat wäre so ein Ansatz eine zu grobe Verallgemeinerung da es unter den Aves eben sowohl flugfähige als auch nicht flugfähige Spezies gibt. Ob solche Vererbungsstrukturen also als richtig oder falsch zu beurteilen sind ist immer kontextabhängig.
    Und um entsprechende Einwände vorwegzunehmen: es ist nicht richtig, dann in jedem Fall unbedingt alle Möglichkeiten abzugreifen und in dem physikalischen Simulator die flugfähigen Vögel zu benutzen, die von den Vögeln abgeleitet sind, die wiederum von den Tieren abgeleitet sind, die von den Lebewesen abgeleitet sind... Das wäre Information Overkill und trägt nicht zur Lösung des Problems bei.



  • pumuckl schrieb:

    ...

    Danke. Genau darauf wollte ich hinaus.


Anmelden zum Antworten