Mehrfachvererbung



  • Hallo.
    Ich hab da n Problem und hoffe, ihr könnt mir da helfen. Es geht um das Thema Mehrfachvererbung.

    Standardmäßig gibt es ja die Klasse CDialog. Von dieser leite ich eine eigene Klasse ab, CMyDialog. In CMyDialog habe ich eigene Funktionen, fülle aber zudem auch noch die Funktion OnToolTipNotify(...).
    Zudem habe ich einen eigenen FileDialog von CFileDialog abgeleitet, CMyFileDialog, um ihn mit weiteren Funktionen noch weiter auszubauen.
    Leite ich jetz einen weiteren Dialog (CChildDialog) von CMyDialog und CMyFileDialog ab und fülle dies mit Leben, hab ich das Problem, dass er z.B. nicht weiß, woher er die CChildDialog::delete - Methode nehmen soll, weil sie dann zweideutig definiert ist. Entweder über die abgeleiteten Klassen von CMyFileDialog oder über die abgeleiteten Klassen von CMyDialog.
    Wie kann ich jetzt standardmäßig sagen, dass er alle Methoden und Eigenschaften aus CMyFileDialog nimmt und nur in bestimmten wenigen Fällen mal auf CMyDialog zurückgreift?

    Die Ableitung in Header sieht folgendermaßen aus:
    class CMyFileDialog : public CFileDialog, public CMyDialog
    {
    ...
    }

    In der .cpp - Datei kommt z.B. in den Zeilen ein Zweideutigkeitsfehler:
    void CMyChildDialog::DoDataExchange(CDataExchange
    pDX)
    {
    CDialog::DoDataExchange(pDX); //verursacht folgenden Fehler: s.u.
    //{{AFX_DATA_MAP(CXMCFileDialog)
    ...
    //}}AFX_DATA_MAP
    }

    Fehlermeldung:
    mychilddialog.cpp(56) : error C2385: 'CMyChildDialog::CDialog' is ambiguous
    mychilddialog.cpp(56) : warning C4385: could be the 'CDialog' in base 'CCommonDialog' of base 'CFileDialog' of class 'CMyFileDialog'
    mychilddialog.cpp(56) : warning C4385: or the 'CDialog' in base 'CMyDialog' of class 'CMyFileDialog'

    Der Ableitungsbaum der Basisklassen sieht dann ungefähr so aus:
    CDialog
    |- CCommonDialog
    | |- CFileDialog
    | |- CMyFileDialog
    | |-----------------------
    |- CMyDialog |-CChildDialog (abgeleitet von CMyFileDialog und CMyDialog)
    | |-----------------------------

    Hoffe, mir kann da jemand helfen.

    Gruß
    Der Fragende



  • Was hälst du von dem Überschreiben der Methode ::delete und machst daraus:

    CChildDialog::delete ( void )
    {
    
    CMyDialog::delete();
    CMyDialog::delete();
    }
    

    So gehst durch alle Funktionen wo MFC meckert

    Hoffendlich klapp's denn hab' ich nich selbst ausgetestet

    Mit freundlichen Grüßen und viel Glück wünschend
    DeNnis++



  • ...und Du bist sicher, dass es nicht sinnvoll ist, MyFileDialog von MyDialog abzuleiten, dann könntest Du Dir die Mehrfachvererbung sparen.....


Anmelden zum Antworten