Aufruf virtueller Funktionen



  • Hi,

    kann mir einer von euch sagen, warum sich dieser Code nicht fehlerfrei kompilieren lässt, sondern unten zitierte Fehlermeldung erzeugt?

    #include <iostream>
    
    struct Basisklasse {
    	virtual void vf1();
    };
    
    struct AbgeleiteteKlasse : Basisklasse {
    	virtual void vf1() {std::cout<<"Test";};
    };
    
    int main() {
    	AbgeleiteteKlasse d;
    	Basisklasse *bp = &d;
    	bp->vf1();
    }
    

    /tmp/ccEAhpIA.o: In function Basisklasse::Basisklasse()': test3.cpp:(.text._ZN11BasisklasseC2Ev[Basisklasse::Basisklasse()]+0x4): undefined reference tovtable for Basisklasse'
    /tmp/ccEAhpIA.o:(.rodata._ZTI17AbgeleiteteKlasse[typeinfo for AbgeleiteteKlasse]+0x8): undefined reference to `typeinfo for Basisklasse'
    collect2: ld gab 1 als Ende-Status zurück

    Danke im Voraus 🙂



  • struct Basisklasse {
        virtual void vf1()=0;
    };
    
    struct AbgeleiteteKlasse : Basisklasse {
        void vf1() {
    		 std::cout<<"Test";
    	 }
    };
    
    int main() {
        AbgeleiteteKlasse d;
        Basisklasse *bp = &d;
        bp->vf1();
    	 return 1;
    }
    


  • Danke

    Ist eine abstrakte Klasse in dem Fall zwingend notwendig? Ich dachte, das wäre mehr eine Option, um explizit nochmal zu bestätigen, dass keine Objekte von der Klasse angelegt werden. In meinem Buch ist "Basisklasse" jedenfalls nicht abstrakt. Wird dann wahrscheinlich ein Fehler sein.



  • Hallo,

    die muss nicht abstrakt sein. Aber sonst musst Du die Methode in der Basisklasse implementieren.



  • struct base
    {
        virtual void foo() { std::cout << "virtual void base::foo()" << std::endl; }
        virtual void bar() = 0;
    };
    
    struct derived : base 
    {
        virtual void foo() { std::cout << "virtual void derived::foo()" << std::endl; }
    };
    
    int main() 
    {
        base* ptr = new derived;
        ptr->foo();
        ptr->bar();
        delete ptr;
    }
    

    ... sollte melden, das du bar nicht implementiert hast...



  • Danke vielmals. Es haben sich alle Fragen geklärt. 🙂


Anmelden zum Antworten