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.