Problem mit abstrakter Klasse



  • Hallo,

    ich frage mich, warum der Linker bei dem folgenden Code meckert.

    class Renderer
    {
    public:
    	Renderer();
    	virtual ~Renderer(void);
    
    private:
    	Surface* m_pSurface;
    
    protected:
    	virtual Surface* getSurface () const = 0;
    };
    
    Renderer::Renderer () : m_pSurface (getSurface ()) { }
    
    class DX9Renderer : public Renderer
    {
    public:
    	DX9Renderer();
    	virtual ~DX9Renderer(void);
    
    protected:
    	Surface* getSurface () const;
    };
    
    Surface* DX9Renderer::getSurface () const
    {
    	return new DX9Surface ();
    }
    
    Fehler	1	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""protected: virtual class Surface * __thiscall Renderer::getSurface(void)const " (?getSurface@Renderer@@MBEPAVSurface@@XZ)" in Funktion ""public: __thiscall Renderer::Renderer(void)" (??0Renderer@@QAE@XZ)".	Renderer.obj
    

    Ist eine solche Strukturierung in C++ nicht möglich? Ich "komme" aus der Java-Welt und da geht das 🙂

    Vielen Dank im Voraus!



  • während Renderer::Renderer läuft ist das objekt noch ein Renderer, und kein DX9Renderer. daher kann dort sowieso nie DX9Renderer::getSurface aufgerufen werden. d.h. der code könnte sowieso nicht funktionieren.

    dass der linker meckert kommt mir jetzt spontan auch komisch vor, da IMO der linker noch linken müsste, der code dann aber beim ausführen mit einem "pure virtual call" fehler abbrechen sollte (bzw. einfach irgendwie mist bauen, wenn der verwendete compiler "pure virtual call" fehler nicht speziell behandelt).

    müsste ich aber ehrlich gesagt selbst im standard nachsehen wie das genau formuliert ist, bzw. was genau für regeln hier gelten.

    theoretisch ist ja im ctor genau bekannt wer welche virtuelle funktion implementiert, daher kanns leicht sein dass die direkt aufgerufen werden darf - also ohne über den vtable zu gehen. in dem fall wäre das die erklärung dafür warum der linker sudert. was allerdings bei implementierten "pure" funktionen (was ja nicht verboten ist) zu einem IMO etwas seltsamen verhalten führen würde.

    oder kurz: nö, so kann man das in C++ nicht machen. das hat auch gute gründe. eine erklärung würde allerdings hier etwas den rahmen sprengen.


Anmelden zum Antworten