Interfaces und abstrakte Klassen in C++



  • Danke für eure Ausführungen.
    Jetzt hab ichs verstanden.

    Danke.



  • Zumal du nichtmal auf ".h" angewiesen bist. Du könntest die Datei auch .DasBraucheIchNochWoanders nennen 🙂 Ist halt nur länger 😉



  • Fenixx schrieb:

    Es verwirrt mich nur deswegen, weil in meinen Augen Header-Dateien in gewisser Weise auch eine Klassendefinition, wie die eines Interfaces darstellen.
    Für IVogel habe ich demnach keine Header-Datei, sondern nur eine Cpp-Datei. Ist das so richtig?

    Der Header sollte in der Regel (Ausnahmen sind u.a. Templates, aber das soll dich erst einmal nicht interessieren) die reine Deklaration enthalten, wenn man das mit Java vergleicht würde es am Beispiel einer rein abstrakten Basisklasse bedeuten, das es ähnlich wie eine Javaklasse ohne Methodenrümpfe aussieht (Oder wie ein Java Interface).

    // ivogel.h
    #ifndef IVOGEL_HEADER
    #define IVOGEL_HEADER
    
    class IVogel
    {
        public:
            void fliege() = 0;
    };
    
    #endif
    

    Sofern du keine Abstrakte Klasse betrachtest, sieht es ähnlich aus:

    // bar.h
    #ifndef BAR_HEADER
    #define BAR_HEADER
    
    class Bar
    {
        public:
            void foo();
    };
    
    #endif
    

    Die Implementierung der Methode erfolgt dann in der cpp-Datei:

    // bar.cpp
    #include "bar.h"
    
    //   <---> Dieser Teil steht für die Identifikation der Klasse
    void Bar::foo()
    {
    }
    

    Anmerkung: Destruktoren müssen, sofern man sie deklariert, immer eine Implementierung haben. Im Falle einer Basisklasse würde ich in der Regel einen virtuellen Destruktor zur Verfügung stellen. Häufig wird ein leerer Destruktor direkt in der Headerdatei definiert, und nicht extra dafür eine cpp-Datei erzeugt...

    // ivogel.h
    #ifndef IVOGEL_HEADER
    #define IVOGEL_HEADER
    
    class IVogel
    {
        public:
            virtual ~IVogel() {}; // virtuelle Destruktoren erfordern eine Implementierung
            void fliege() = 0;
    };
    
    #endif
    

    cu André



  • Decimad schrieb:

    Zumal du nichtmal auf ".h" angewiesen bist. Du könntest die Datei auch .DasBraucheIchNochWoanders nennen 🙂 Ist halt nur länger 😉

    😃
    oder .CPlusPlusInterfaceDefinition


Anmelden zum Antworten