Vererbungsfrage bzw. RTTI-Problem



  • Hallo!

    Ich habe eine SDI mit zig Doc-View-Pärchen.
    Ich hab ne Basisklasse, von der alle Docs dann abgeleitet werden.

    In der Basisklasse sind alle OnUpdateIrgendwas Funktionen schon mal drin.
    In einigen Docs brauche ich aber ein anderes Verhalten und habe die überschrieben.
    Der Mainframe ruft immer die passende Funktion auf:

    void CMainFrame::OnUpdateBearbeitenDruckenKarten(CCmdUI* pCmdUI) 
    {
    	// Zeiger auf das aktuelle Dokument holen
    	CBasisDoc* pDoc = dynamic_cast<CBasisDoc*>(GetActiveDocument());
    	if (!pDoc)
    	{
    		// Wo kein Dokument ist, gibt es auch nichts zu tun.
    		pCmdUI->Enable(FALSE);
    	}
    	else
    	{
    		// Das Dokument darf den Rest machen.
    		pDoc->OnUpdateBearbeitenDruckenKarten(pCmdUI);
    	}
    }
    

    Bei allen Docs außer dem neusten (Statistik) funktioniert es.
    Ich habe aber nix (bewusst) anders gemacht. 😕

    Es ist von CBasisDoc abgeleitet... die Funktionen hab ich zur Vermeidung von Tippfehlern einfach kopiert.
    Alles neu erstellen habe ich auch schon gemacht.

    Wo kann ich noch suchen? 😞



  • hallo

    mit wenig ahnung von mfc würde mich trotzdem interessieren, WAS nicht funktioniert? gibt es eine fehlermeldung?
    oder funktioniert einfach die methode nicht wie erwartet?

    wen compilerfehler, wäre es interessant, was er sagt.
    wenn laufzeitproblem, was macht der debugger?

    gruß 🙂



  • Achso, arg da war ich ja nebemn mir. 😮

    Also: Es sollte eigentlich die OnUpdateBearbeitenDruckenKarten vom StatistikDoc aufgerufen werden.
    Es wird aber die OnUpdateBearbeitenDruckenKarten vom BasisDoc aufgerufen. 😕



  • Ist "OnUpdateBearbeitenDruckenKarten" auch virtual und hat exakt die gleiche Signatur in der Ableitung?



  • Jochen Kalmbach schrieb:

    Ist "OnUpdateBearbeitenDruckenKarten" auch virtual und hat exakt die gleiche Signatur in der Ableitung?

    Ja, das virtual steht da (hab ich vorhin noch mehrfach nachgeguckt) und ich kopiere immer den Code aus der Basisklasse in die abgeleiteten Klassen und ändere da dann nur den Klassennamen und den "Inhalt". (Zwecks Fehlervermeidung und Faulheit. 😉 )
    Sogar der Kollege hat nochmal draufgeguckt, weil er dachte hab Großkleinschreibung falsch. Da hab ich die Deklaration aus der Basisklasse nochmal unter die in der abgeleiteten Klasse kopiert: Das ist identisch auf den Buchstaben. 😕



  • Hm. Versuchs doch mal mit dem Debugger. Der sollte ja anzeigen welchen Typ "*pDoc" wirklich hat (der VC8 kann es auf jeden Fall). Wenn der Debugger anzeigt dass es die falsche Klasse ist liegt das Problem eben woanders, vermutlich mal dort wo die Instanz erzeugt wird. Wenn die Klasse passt einfach mal reinsteppen. Wenn du dann direkt in der CBasisDoc Methode landest dann kann es eigentlich nurmehr an einer ungleichen Signatur liegen -- zumindest wüsste ich keine andere Erklärung.

    Und guck dir die Definition von StatistikDoc::OnUpdateBearbeitenDruckenKarten an, nicht dass dort "return CBasisDoc::OnUpdateBearbeitenDruckenKarten(pCmdUI);" steht 😃



  • Okay, hier noch die einzelnen Funktionen:
    😮
    *imbodenversink*
    Wie können zwei Leute DAS übersehen?
    Ich habs doch extra untereinander kopiert gehabt...

    Irgendwas hatte in der abgeleiteten Klasse das n gefressen.

    virtual void OnUpdateBearbeitenDruckenKarte(CCmdUI* pCmdUI);
    

    muss sein:

    virtual void OnUpdateBearbeitenDruckenKarten(CCmdUI* pCmdUI);
    

    Danke für eure Hilfe... 🙂 ich muss wohl mal zum Optiker. 🙄


Anmelden zum Antworten