abstrakte Klassen



  • Warum geht das nicht?
    "B" ist doch jetzt nicht mehr abstrakt oder, sondern nur "A" und "temp".

    #include <iostream>
    using namespace std;
    
    class temp
    {
        virtual void speak() = 0;
        virtual void reproduce() = 0;
        virtual void laugh() = 0;
    };
    
    class A : public temp
    {
        public:
        void reproduce();
    };
    
    class B : public A
    {
        public:
        void speak();
        void laugh();
    };
    
    int main()
    {
        B obj;
    
        return 0;
    }
    

    FEHLERMELDUNG:

    Compiling: C:\MinGW\Andi\test.cpp
    Linking console executable: C:\MinGW\Andi\test.exe
    C:\MinGW\Andi\test.o:test.cpp:(.text_ZN1BC1Ev[B::B()]+0x16): undefined reference to `vtable for B' C:\\MinGW\\Andi\\test.o:test.cpp:(.text_ZN1AC2Ev[A::A()]+0x16): undefined reference to `vtable for A'
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)
    0 errors, 0 warnings

    Checking for existence: C:\MinGW\Andi\test.exe

    MfG
    Stromberg


  • Mod

    Stromberg schrieb:

    Warum geht das nicht?

    Es geht doch. Nur beschwert sich der Linker, dass deine überschreibenden Funktionen nicht definiert wurden. Virtuelle Funktionen, die nicht rein-virtuell sind, müssen auch dann definiert werden, wenn sie nicht benutzt werden.



  • // #include <iostream> nicht genutzt
    // using namespace std; // NIE im Header
    
    class base
    {
    public:
        base() {}
        virtual ~base() {}
    
    public:
        virtual void speak() {};
        virtual void reproduce() {};
        virtual void laugh() {};
    };
    
    class foo : public base
    {
    public:
        void reproduce();
    };
    
    class bar : public base
    {
    public:
        void speak();
        void laugh();
    };
    

    und der hält die Klappe 😉

    #include <vector>
    
    int main()
    {
        std::vector<base*> data;
        B _obj;
        data.push_back(&_obj);
    }
    


  • (D)Evil schrieb:

    und der hält die Klappe 😉

    Da gibt's rein gar nichts zu ";)", denn das ist genau das Problem deiner Variante.


Anmelden zum Antworten