Verständnisproblem bei virtuellen Funktionen



  • Ich habe einen Klasse CBaseGraphCtrldie folgende Funktion definiert:

    class CBaseGraphCtrl : 	public CStatic
    {
    public:
    	virtual void PaintContent(CDC &pDC);
    ...
    }
    

    und sie nutzt in OnPaint

    void CBaseGraphCtrl::OnPaint() 
    {
    	CPaintDC dc(this); 
    	PaintContent(dc);
    }
    

    d.h. ich definiere und nutze ein Funktion ohne den Inhalt der Funktion zu definieren.

    Das tue - und will ich erst in den davon abgeleiteten Klasse

    class CPlotCtrl : public CBaseGraphCtrl
    {
    public:
    	void PaintContent(CDC &pDC);
    	CMfcPlot Plot;
    };
    
    void CPlotCtrl::PaintContent(CDC &pDC)
    {
    	Plot.SetPlotDC(&pDC);
    	Plot.Plot();
    }
    

    dieses vorgehen bringt mir jedoch den Linkerfehler:

    error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual void __thiscall CBaseGraphCtrl::PaintContent(class CDC &)" (?PaintContent@CBaseGraphCtrl@@UAEXAAVCDC@@@Z)".

    Habe ich etwas falsch verstanden, und wenn ja wie löse ich mein Problem?

    Matthias



  • Hallo,

    eine Funktion virtual zu machen heisst ja: Wer Bock hat kann mich überschreiben.
    Folglich musst du die Funktion der Basisklasse abstrakt machen oder ihr
    einen (leeren) Funktionsrumpf spendieren.

    Jockel



  • Und, um den Vorredner zu ergänzen, abstrakt machst Du die Funktion, indem Du '= 0' dahinter schreibst. Also:

    virtual void PaintContent(CDC &pDC) = 0;
    


  • Braucht man dann eigentlich einen virtuellen Dekonstruktor?



  • dedjhrgfjserikdihjhh schrieb:

    Braucht man dann eigentlich einen virtuellen Dekonstruktor?

    Eigentlich ja.



  • Im Grund bist du bei öffentlicher Ableitung immer auf sicherer Seite mit virtuellem Destruktor.


Anmelden zum Antworten