Zu dumm zum vererben



  • Hi all,
    ich stehe hier grad ein bißchen auf dem Schlauch. Ich habe folgende Klassenstruktur:

    class MySocket
    {
    	public:
    		MySocket();
    		virtual ~MySocket();	
    
    	protected:
    		virtual SOCKET CreateSocket() = 0;
    
    	private:
    		SOCKET m_Socket;
    
    };
    
    class MyTCPSocket : public MySocket
    {
    	public:
    		MyTCPSocket(){};
    
    	protected:
    		virtual SOCKET CreateSocket();
    
    };
    

    und will im Konstruktor von MySocket

    m_Socket = CreateSocket();
    

    aufrufen.
    Wenn ich dann in einem Testprog eine Instanz von MyTCPSocket erzeugen will, beschwert sich der Linker über eine nicht aufgelöste Referenz:
    mysocket.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""pr
    otected: virtual unsigned int __thiscall MySocket::CreateSocket(void)" (?CreateS
    ocket@MySocket@@MAEIXZ)" in Funktion ""public: __thiscall MySocket::MySocket(voi
    d)" (??0MySocket@@QAE@XZ)".

    CreateSocket ist in MyTCPSocket implementiert.
    Wo ist mein Fehler?



  • Du rufst im Konstruktor von MySocket die Funktion CreateSocket auf. Im Konstruktor klappt das noch nicht mit den virtuellen Funktionen, deshalb soll die Funktion MySocket::CreateSocket aufgerufen werden - und die ist nicht implementiert 😉



  • Belli schrieb:

    Wo ist mein Fehler?

    Stark vereinfacht dargestellt:

    Wenn du eine Instanz einer Klasse erzeugst, die über eine Basisklasse verfügt, erfolgt die Erzeugung immer aus Richtung der Basisklasse:

    class A;
    class B : public A;
    class C : public B;
    

    Wenn ich nun ein Objekt der Klasse C erzeuge, wird zuerst der A-Anteil, dann der B-Anteil und dann der C-Anteil erzeugt. Ergo kann ein Konstruktor der Basisklasse auch noch nicht die virtuellen Methoden aus den abgeleiteten Klassen kennen.



  • Ich danke Euch für die Info!



  • So im Nachhinein wundert es mich etwas, daß nicht schon der Compiler meckert ... Der kriegt doch schon die Info, daß CreateSocket() in MySocket abstrakt ist, und daß es aus dem Konstruktor aufgerufen wird ...

    Naja, ändern würde es natürlich nix an den Fakten ...


Anmelden zum Antworten