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?


Anmelden zum Antworten