Problem beim aufruf virtueller Methoden



  • [EDIT]
    (Schaut gleich nach ganz unten der meiste Teil war im C++ Forum)

    Ich schreib gerade an zwei Klassen:
    Eine Klasse BaseClass und eine davon abgeleitete Klasse Ableitung.

    //BaseClass.h:
    class BaseClass  
    {
    public:
    	void StartCall();
    	BaseClass();
    	virtual ~BaseClass();
    
    protected:
    	void TheCall();
    };
    
    //BaseClass.cpp
    void BaseClass::StartCall()
    {
    	TheCall();
    }
    
    void BaseClass::TheCall()
    {
    	cout <<"BaseClass NEIIIIIIIIIN" <<endl; :rage: 
    }
    

    So, wenn jetzt StartCall() aufgerufen wird dann soll TheCall aufgerufen werden.
    Jetzt will ich aber in meiner Ableitung, dass dann anstatt der Methode die überschriebene TheCall() aufgerufen wird.
    StartCall() soll aber nicht überschrieben werden !!! 😞
    Was tun ?

    //Ableitung.h
    #include "BaseClass.h"
    
    class Ableitung : public BaseClass 
    {
    public:
    
    	Ableitung();
    	virtual ~Ableitung();
    
    protected:	
    	void TheCall();
    
    };
    
    //Ableitung.cpp
    void Ableitung::TheCall()
    {
    	cout <<"Ableitung !!!!! JUHUUUU!" <<endl; :D 
    }
    


  • baseclass.h:

    class BaseClass  
    {
    public:
        void StartCall();
        BaseClass();
        virtual ~BaseClass();
    
    protected:
        virtual void TheCall(); //hier
    };
    

    mehr: http://tutorial.schornboeck.net/virtual.htm
    du solltest dir eventuell auch dein lieblingsc++buch zur hand nehmen und das kapitel über polymorphie und virtuelle funktionen noch einmal durchlesen 🙂



  • Teste mal das:

    //BaseClass.h:
    
    class BaseClass  
    {
    public:
        virtual void StartCall();
        BaseClass();
        virtual ~BaseClass();
    
    protected:
        virtual void TheCall();
    };
    
    //BaseClass.cpp
    void BaseClass::StartCall()
    {
        TheCall();
    }
    
    void BaseClass::TheCall()
    {
        cout <<"BaseClass NEIIIIIIIIIN" <<endl;  
    }
    //Ableitung.h
    #include "BaseClass.h"
    
    class Ableitung : public BaseClass 
    {
    public:
    
        Ableitung();
        virtual ~Ableitung();
    
    protected:    
        virtual void TheCall();
    
    };
    
    //Ableitung.cpp
    void Ableitung::TheCall()
    {
        cout <<"Ableitung !!!!! JUHUUUU!" <<endl;  
    }
    


  • Ich kann leider kein virtual hernehmen.
    Es ist ein MFC Projekt und irgendwie gibts da die Meldung:

    Warning: calling DestroyWindow in CDialog::~CDialog --
    OnDestroy or PostNcDestroy in derived class will not be called.

    Und irgendeine Adresse auf dem Heap findet er net (nehme an is die VMT)



  • ich nehme an die leute im mfc forum können dir dann besser helfen.



  • Dieser Thread wurde von Moderator/in davie aus dem Forum C++ in das Forum MFC mit dem Visual C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich wollte ein Klasse schreiben, die ein Trayicon einer Anwendung verwaltet

    So sieht meine Klasse aus (könnt ihr unter http://mitglied.lycos.de/xcooperation/download->trayicon.zip downloaden):

    //Trayicon.h
    #define WM_TRAYICON WM_USER + 1
    #define ON_WM_TRAYICON ON_MESSAGE(WM_TRAYICON, OnTrayMesseage)
    class CTrayIcon  
    {
        //Funktionen zum anzeigen etc.
    protected:
    	afx_msg LRESULT OnTrayMesseage(WPARAM wParam, LPARAM lParam); //Wird  aufgerufen wenn ON_WM_TRAYICON eintritt
    
    	virtual void OnTIMouseMove(CPoint pt);// Kann man überschreiben
    	virtual void OnTIRButtonDown(CPoint pt);
    	virtual void OnTILButtonDown(CPoint pt);
    	virtual void OnTIOtherMSG(UINT msg,CPoint pt);
    };
    
    //Funktion, die von ON_WM_TRAYICON aufgerufen wird:
    LRESULT CTrayIcon::OnTrayMesseage(WPARAM wParam,LPARAM lParam)
    {
    	CPoint cursor;
    	GetCursorPos(&cursor);
    	if(wParam != trayicon.uID)
    		return 0;
    
    	switch(lParam)//Je nach Code soll die entsprechende Funktion in der abgeleiteten Klasse aufegerufen werden
    	{
    	case WM_MOUSEMOVE:
    		OnTIMouseMove(cursor);break;// :rage: beim aufruf Fehler HEAP irgendetwas nich gefunden ungültige adresse (VMT ???) Wenn ich virtual weglasse funktionierts nur ruft er dann die Methode der Basisklasse auf. Seufz!
    	case WM_LBUTTONDOWN:
    		OnTILButtonDown(cursor);break;
    	case WM_RBUTTONDOWN:
    		OnTIRButtonDown(cursor);break;
    	default:
    		OnTIOtherMSG(lParam,cursor);
    	}
    
    	return 0;
    }
    //Die OnTI Funtkionen habe ich alle mit leerer Zeile definiert
    

    Einfügen tu ich die Klasse in dem ich z.B. einen Dialog davon ableite:
    CMyDialog : public CDialog , public CTrayIcon

    So und jetzt kann man in die MessageMap ON_WM_TRAYICON eintragen

    BEGIN_MESSAGE_MAP(CSomeTestsDlg, CDialog)
    	//{{AFX_MSG_MAP(CSomeTestsDlg)
    	ON_WM_PAINT()
    	ON_WM_RBUTTONDOWN()
    	//}}AFX_MSG_MAP
    	ON_WM_TRAYICON
    END_MESSAGE_MAP()
    

    Und dann muss man nur noch die Methoden überschreiben auf die man reagieren will z.B. OnTILButtonDown
    Aber dort oben gibts leider immer nen Fehler.


Anmelden zum Antworten