pure virtual function call



  • Hi!

    Die Basics sind mir bekannt (abstrakte Klassen usw.). Ich frage mich nur, wie es passieren kann das man eben diese Meldung "pure virtual function call" erhält?

    Man kann doch von abstrakten Klassen keine Objekte anlegen, wie kann es dennoch passieren das so etwas auftritt?



  • Zeige ma deinen Quelltext.



  • Bei mir stürzt nichts ab, mich interessiert lediglich was programmintern passieren muss, damit dieser Fehler auftaucht 😉



  • Ist das ein Compiler- oder ein Laufzeitfehler? Ich hatte ihn noch nicht.



  • .filmor schrieb:

    Ist das ein Compiler- oder ein Laufzeitfehler? Ich hatte ihn noch nicht.

    Das ist ein Laufzeitfehler. Ich hab den schon öfter mal in Programmen gehabt.

    Ich frage mich nur, wie das rein logisch gehen soll.



  • Kannst ganz einfach reproduzieren, indem du eine rein virtuelle methode aus dem Konstruktor der Basisklasse aufrufst.

    class Base
    {
    public:
       Base() { test (); }
       void test () = 0;
    };
    
    class  Derived : public Base
    {
    public:
       void test() {}
    };
    
    int main (...)
    {
       Derived pureVirtualFunctionCall;
    }
    


  • error C2253: "Base::test": Ein reiner Spezifizierer oder ein abstrakter Überschreibungsspezifizierer ist nur für eine virtuelle Funktion zulässig.

    😕



  • class Base
    {
    public:
        virtual void fun () = 0;
    };
    
    int main ()
    {
        Base* p;
        (*p).fun ();
    }
    

    Das gibt einen Laufzeitfehler, allerdings den (erwarteten) Segfault.



  • Delryn schrieb:

    error C2253: "Base::test": Ein reiner Spezifizierer oder ein abstrakter Überschreibungsspezifizierer ist nur für eine virtuelle Funktion zulässig.

    Es muss heißen:

    class Base
    {
    public:
       Base() { test (); }
       virtual void test () = 0;
    };
    

    Allerdings sollte in diesem Beispiel bereits der Linker das Problem feststellen.
    Eine weitere Indirektion und du hast dein gewünschtes Beispiel:

    class Base
    {
    public:
       Base() { test (); }
    	 void test() {
    		doTest();
    	 }
    private:
    	 virtual void doTest () = 0;
    };
    
    class  Derived : public Base
    {
    	void doTest() {}
    };
    

    .filmor schrieb:

    class Base
    {
    public:
        virtual void fun () = 0;
    };
    
    int main ()
    {
        Base* p;
        (*p).fun ();
    }
    

    Das gibt einen Laufzeitfehler, allerdings den (erwarteten) Segfault.

    Der hat allerdings nix mit rein virtuellen Methoden zu tun. Du dereferenzierst einen ungültigen Zeiger.


Anmelden zum Antworten