von zwei klassen ableiten (war: Evi48)



  • Ich bin auch Fan von MehrfachVererbung ! (steinigt mich ! 😃 )
    Ist manchmal echt nuetzlich, wenn man kleine oft verwendete kompontenten wie nen Puzzle zu ner komplex funktionierenden Klasse zusammenbauen kann.
    Die meisten sagen dann zwar, statt Vererbung Aggregation nehmen, ich hab aber meist nie die Lust, Basisfunktionen der einzelnen Komponenenten per Hand durchzuschleifen ...

    Bei der MFC geht Mehrfachvererbung aber auch, nur machen meist Klasen Probleme, die in Ihrer eigenen VererbungsHirarchie nen gemeinsammen Perant haben ....
    oder methoden virtuell doppelt definieren, das Bring definitiv probleme.

    Deshalb Mehrfachvererbung lieber nur bei eigenen Klassen einstzen, wo Weist was sie tun, wo sie herkommen, und welche methoden wer aufruft, ... oder prinzipiell in der ATL, da ist Mehrfachvererbung die Methode !

    Ciao ....



  • Der BCB6 sollte Mehrfachvererbung angeblich zumindest "teilweise" unterstützen. Ich weiss allerdings nicht, ob damit der in der Hilfe unter multiple inheritance beschriebene Einsatz von interfaces gemeint ist, was ja dortselbst nur als Workaround bezeichnet wird.

    Das nur so als Anmerkung; mir ist nicht entgangen, dass evi48 den BCB5 benutzt. 😉



  • Können einige hier nicht lesen:

    Ich habe geschrieben, das man von VCL oder MFC-Klassen nicht MEHRFACHVERERBEN kann. Einfache Vererbung (single inheritance) ist natürlich möglich und muß ja sogar sein.

    Natürlich kann man von einer Combobox erben oder von einem Dialog, sonst wäre ja das Framework sinnlos.

    Man kann aber nicht einfach gleichzeitig von einem Edit und einer Combobox erben.



  • Laut Borland ist im BCB6 Mehrfachvererbung möglich...

    glauben tu ichs aber nicht.



  • Interfacevererbung!

    D.h. Klassen ohne Member können mehrfach vererben. Das wird wohl schon sein.

    Ist ja auch kein Beinbruch, für die Masse der VCL-Klassen ist es ohnehin sinnlos, und für Backend-Klassen gibt's die Einschränkung nicht. Reine C++-Klassen kann ich auch mit dem BCB4,5,6 mehrfach vererben.



  • Original erstellt von Marc++us:
    Natürlich kann man von einer Combobox erben oder von einem Dialog, sonst wäre ja das Framework sinnlos. Man kann aber nicht einfach gleichzeitig von einem Edit und einer Combobox erben.

    Ja, es kam aber so rüber, als ob du sagen wolltest, dass man nicht von irgendeiner Klasse und CEdit gleichzeitig erben kann 🙂 . Dass es mit CComboBox und CEdit nicht gleichzeitig geht ist ja klar, weil sie beide von CWnd abgeleitet sind.



  • Warum sollte das nicht gehen? Ich habs jetzt nicht ausprobiert, aber mich würde schon interessieren, warum das nicht gehen soll.

    Es mag vielleicht als Anwender dieser beiden Klassen wenig Sinn machen, aber der Compiler wird es wohl (hoffentlich) ohne Fehler compilieren. Denn ob beide von CWnd abgeleitet sind, interessiert ihn herzlich wenig.



  • Vielleicht sollte ich es anders formulieren: es läßt sich übersetzen, aber das Framework wird nicht einfach damit klarkommen, insbesondere wird die erzeugte Klasse eben nicht die Eigenschaften der beiden Oberklassen besitzen, sondern teilweise unvorhersehbares Verhalten erzeugen.



  • Warum sollte das nicht gehen? Ich habs jetzt nicht ausprobiert, aber mich würde schon interessieren, warum das nicht gehen soll.

    Probleme gibt es definitiv:

    Beispiel: Klasse B ist die Basis ... C1 und C2 sind von B abgeleitet ...
    Und du magst X nun von C1 und C2 ableiten ....

    Willst du nun von X eine Basisfunction f1() von B aufrufen ... ohne vollstaendige Syntax wuerde erst mal nen Error kommen.
    Umgehen kann man das, in dem man in X die Function genau aufloest, also C1::B::f1() aufruft ... was fuer eine Syntax 🙂
    Sonst weiss der Compiler ja ned welche f1() er nehmen soll, hat ja f1() 2 mal geerbt.
    Richtig aergerlich wird es dann, wenn B virtuelle funktionen hat, die durch C1 und C2 implementiert werden ! durch die gemeinsamme Vererbung impelentierst du die virtuelle Funktion 2 mal auf gleicher Ebene ! Aua, welche Version soll der compiler nehmen, wenn du sie in X nicht noch mal definierst !
    Und genauer Aufloesung kommst da nicht hin, weil die Aufrufe ja in den Basisklassen definiert sind !!!
    Dduerfte bei CWnd schon der Fall sein ?

    Ich habe geschrieben, das man von VCL oder MFC-Klassen nicht MEHRFACHVERERBEN kann

    Klar kann man ! warum ned ?
    Ist CRect ne MFC klasse ?
    Ist CTime ne MFC Klasse ?

    Class MySickClass : public CRect, public CTime
    {
    }
    

    Geht also ned ???
    Habs ned probiert, sollte aber 🙂

    Oder zaehlen nur Klassen, die von CObject abgeleitet sind ? :-)))

    Und es gibt zumindest bei VC++ 6.0 und der Mfc keinen "Schutz" gegen Mehrfachvererbung, es funktioniert halt nur prinzipell eher selten ...

    Ciao ...

    [ Dieser Beitrag wurde am 10.07.2003 um 16:08 Uhr von RHBaum editiert. ]



  • Original erstellt von RHBaum:
    **Oder zaehlen nur Klassen, die von CObject abgeleitet sind ? :-)))
    **

    Er hat vielleicht von Framework-Klassen gesprochen. Kennst du da eine die nicht von CObject abgeleitet ist du n00b?



  • Ausserdem schreibt man class bei einer Klassendefinition klein. n00b!



  • @RHBaum:
    wie schaut es denn mit dem Ctor der obersten Klasse. Wer ruft CObject() auf? CEdit oder CCombobox??

    @All:
    warum glaubt ihr, gibt es virtual vererbung? na genau darum, dass man so einen deadly Diamond of Death entschaeften kann:

    CObject
              /      \
             /        \ 
          CEdit      CCombobox
             \        /
              \      /
              MyWhatever
    

    siehe auch: http://www.gotw.ca/gotw/037.htm



  • Original erstellt von Shade Of Mine:
    **@All:
    warum glaubt ihr, gibt es virtual vererbung? na genau darum, dass man so einen deadly Diamond of Death entschaeften kann:
    **

    naja, ganz so einfach ist es nicht.
    virtuelle vererbung mags ja bringen, um zwei CWindows in ihrer Funktion als Nachrichten-Empfänger zu einem zu machen, aber wenn sie echt zwei positionen brauchen, wirds doof.
    hat der bibliotheks-entwickler fesrgelegt, daß mehrfache vererbung nicht sein soll, dann soll sie halt nicht sein.
    und gabs da nicht überall "delete this;"? möcht ja mal wissen, wie es ist, wenn man seinen doppeldialog von zwei windows erben läßt, die beide "delete this;" ausführen, wenn sie von der gui verschwinden.



  • Original erstellt von volkard:
    naja, ganz so einfach ist es nicht.

    prinzipiell wollte ich damit nur sagen:
    fuer solche faelle (deadly diamond of death) wurde virtual vererbung erfunden um es zu umgehen.

    aber virtual vererbung kann man nachtraeglich nicht hinzufuegen - wenn also das design feststeht, dass alles von CObject erbt (was ich fuer schwachsinn halte), laesst es sich nicht mehr aendern.

    um ehrlich zu sein, ich habe virtual vererbung noch nie gebraucht, und mehrfachvererbung noch nicht im stile von ist-ein.



  • Original erstellt von Shade Of Mine:
    ...dass alles von CObject erbt (was ich fuer schwachsinn halte...

    Da kann man sich im Falle der MFC jetzt drüber streiten.



  • jo, z.B. das Serialize ist voll nützlich 😮 😮


Anmelden zum Antworten