Frage zu Vererbung (MFC)
-
Und wie bringe ich besagte Fehlermeldung weg?
-
Gib deiner Klasse eine Funktion "delete".
-
exakt, du musst delete überschreiben, sonst weis der compiler nicht, ob er CButton::delete() oder CMyWnd::delete() aufrufen soll.
-
Eine Funktion "delete" geben?
Hier nochmal der Code in ausführlicher.
class CMyWnd : public CWnd { public: CMyWnd(){}; virtual ~CMyWnd(){}; }; class CMyButton : public CMyWnd, public CButton { public: CMyButton(){}; virtual ~CMyButton(){}; };
Der Code bringt besagten Fehler hervor. Und was soll ich da jetzt noch hinzufügen?
-
Naja, du musst in die MSDN gucken, wie delete aussehen muss und fügst das in deine Klasse ein und ruft von da aus die Basisklasse (CWnd) auf.
class CMyButton : public CMyWnd, public CButton { public: CMyButton(){}; ~CMyButton(){}; void operator delete( void* p ); };
-
rewe schrieb:
Compiler meint folgendes:
MyButton.cpp(15) : error C2385: 'CMyButton::delete' is ambiguous MyButton.cpp(15) : warning C4385: could be the 'delete' in base 'CObject' of base 'CCmdTarget' of base 'CWnd' of base 'CMyWnd' of class 'CMyButton' MyButton.cpp(15) : warning C4385: or the 'delete' in base 'CObject' of base 'CCmdTarget' of base 'CWnd' of base 'CButton' of class 'CMyButton'
Bei CMyButton::delete weiß er nicht welches "delete" er aufrufen soll.
Oder besser, er weiß den Weg nicht.also
/* keine Ahnung */ CMyButton::delete(/* keine Ahnung */) { return CButton::delete( /* keine Ahnung */); }
-
OK. Danke vielmals! Habs kapiert. Und es funktioniert.
Wusste gar nicht, dass man delete überschreiben kann.
-
Du kannst ALLES (naja fast) überschreiben. Du musst nur wissen, wie der Prototyp aussieht.
D.h. du kannst auch eigene = != == < > << usw machen.
Und du kannst auch das Nutzen von bestimmten Funktionen aus den Basisklassen verbieten.
-
-
class CMyButton: public CMyWnd, public CButton { void* operator new(size_t nSize) {return malloc(nSize);}; void* operator new(size_t nSize, LPCSTR lpszFileName, int nLine){return malloc(nSize);}; void operator delete(void* p){ free(p); }; void operator delete(void *p, LPCSTR lpszFileName, int nLine){ free(p); };
Ist das so korrekt?