C::B mingw pure virtual function



  • Hi Leute

    ich habe ein Problem in meinem Projekt mit der Vererbung einer Funktion, bzw. der Reaktion darauf.

    Folgende Situation:

    Basisklasse

    namespace baseserver
    {
        class TCPConnection : public tools::BaseThread
        {
        public:
            TCPConnection();
            virtual ~TCPConnection();
    
        protected:
            virtual void OnConnect() = 0;
            ...
    
        private:
           ...
        };
    }
    

    Ableitung

    class SenderConnection : public baseserver::TCPConnection
    {
    public:
        SenderConnection();
        virtual ~SenderConnection();
    
    private:
        virtual void OnConnect();
        ....
    };
    

    In der Klasse TCPConnection wird an einer Stelle die Funktion OnConnect aufgerufen, was eigentlich kein Problem sein sollte, da die abgeleitete Klasse die Funktion überschrieben hat. Die Funktion ist selbstredend auch implementiert.

    Leider bricht das Programm an der Stelle sofort ab und
    gibt als Meldung:

    *Setting breakpoints
    Debugger name and version: GNU gdb 6.8
    Child process PID: 4620
    Program exited with code 03.
    Debugger finished with status 0
    *

    Wenn ich die Abstraktion entferne und statt

    virtual void OnConnect() = 0;
    

    lieber

    virtual void OnConnect() {}
    

    schreibe, und dann debugge, lande ich tatsächlich in der OnConnect-Funktion der Basisklasse. Scheinbar hat der Compiler nicht gerafft, dass ich die Funktion überschrieben habe...

    Hat jemand eine Idee zu dem Problem, bzw. ein vergleichbares Problem schonmal erlebt?



  • Scheinbar hat der Compiler nicht gerafft, dass ich die Funktion überschrieben habe

    Das glaube ich kaum. Wie sieht ein Minimalbeispiel aus, das den Fehler produziert? Rufst du die Methode innerhalb eines Konstruktors auf? Was ist mit dem Callstack? Ansonsten: http://www.artima.com/cppsource/pure_virtual.html



  • Schwierig zu generieren... das ist eine ganze Multithreaded-Umgebung mit Sockets und diversen anderen Spielzeugen...

    Ich versuch mal, ob ich ein SingleThreaded-Minimalbeispiel extrahiert bekomme.



  • Im Konstruktor der Basisklasse erzeuge ich mit beginthreadex einen Thread, in dessen "Run-Funktion" das Event praktisch sofort aufgerufen wird.

    Kann es sein, dass es daran liegt, dass dort das Objekt noch nicht komplett konstruiert ist?



  • Problem erkannt 😉

    Klarer Fall von Schlamperei in der Konzeption der Klasse 😉


Anmelden zum Antworten