'delete' ist mehrdeutig.



  • Hi,

    ich versuche gerade, eine Dialoganwendung (abgeleitet CDialog) via Merfachvererbung mit einer von CCmdTarget abgeleiteten Klasse zu verheiraten. Leider beanstandet der Compiler in diesem Fall logischerweise die Mehrdeutigkeit des delete-Operators, da beide Objekte von CObject abgeleitet sind. Kennt ihr einen Weg, dies zu umgehen?

    error C2385: 'CCommTestDlg::delete' ist mehrdeutig
    warning C4385: 'kann sein 'delete' in Basisklasse 'CObject' of base 'CCmdTarget' of base 'CWnd' of base 'CDialog' of class 'CCommTestDlg'
    warning C4385: 'oder 'delete' in Basisklasse 'CObject' of base 'CCmdTarget' of base 'CCommConnection' of class 'CLIDAR_CommTestDlg'

    Vielen Dank im Voraus für Eure Hilfe.

    Grüße,

    neth



  • schonma mit ::delete probiert 😛



  • Wenn dies beim Kompilieren einer DLL, also ohne irgendeine Instanziierung der Klasse auftritt? Wohl kaum.
    Die Ursache des Problems ist durchaus logisch: Wenn zwei Klassen mit gleicher Basis zusammengeführt werden, ist beim Zerstören unklar, welches der beiden Destruktoren das gemeinsame Basisobjekt zerstören darf. Immerhin existiert davon ja nur ein Satz an Methoden und Attributen. Aber da C++ diese Zusammenführung zulässt, muss es auch ein Möglichkeit geben. Mir fällt diese momentam beim besten Willen nicht ein.

    Bitte nochmals um hilfreiche Zuschriften,

    neth



  • Hallo,
    also erstmal ist das imo ein Fehler in deinem Compiler. Op new/delete sind immer statisch zu einer Klasse, deshalb sehe ich keine mehrdeutigkeit hier (Mehrdeutig wäre natürlich sowas: CObject* p = new DeinDlg();).

    Es gibt zwei Möglichkeiten das Problem zu beheben:
    1. Virtuelle Vererbung verwenden
    2. operator new und operator delete in deiner Dialog-Klasse implementieren.

    Die erste Möglichkeit fällt raus, da CCmdTarget und CWnd nun mal nicht virtuell von CObject erben und du das nachträglich nicht ändern kannst. Die zweite Möglichkeit sollte sich allerdings ohne großen Aufwand umsetzen lassen.

    PS: Meines Wissens nach unterstützt die MFC keine Mehrfachvererbung von Framework-Klassen. Du kannst also imo immer nur von einer MFC-Klasse ableiten.
    Alles andere wirft Konzepte wie die Message Map durcheinander.

    Diesbezüglich solltest du aber im MFC-Forum weiterfragen.



  • in dem Zusammenhang hab ich mal was von virtual vererbung gelesen,
    solltest du mal suchen, hilft dir evtl. Ist aber keine Saubere Lösung aus Technischer Sicht finde ich.

    Anderenfalls kannst du evtl. den delete-operator überladen, und so die
    Mehrdeutigkeit auflösen.

    Devil


Anmelden zum Antworten