von zwei klassen ableiten (war: Evi48)



  • Also, es ist für VCL-Klassen (erkennbar am großen "T" im Namen) ebenso wie für MFC-Klassen (erkennbar am großen "C") verboten eine Mehrfachvererbung zu konstruieren.

    C++ erlaubt das.

    Die Framework-Klassen erlauben es nicht.

    Punkt, aus, basta - an dem Punkt braucht Ihr nicht weiter diskutieren, das war eine Festlegung der Framework-Designer.

    Du willst einen Komponente bilden, die einen Thread enthält? Dann ist die wesentliche Eigenschaft die Komponente, TComponent. Führe TThread dann als Membervariable von TComponent ein, also sowas:

    class EviComponent : public TComponent
    {
    ...
    private:
       TThread* m_pTThread;  // VCL-Klassen lassen sich nur über Zeiger 
                             // instanziieren
    };
    

    Die notwendigen Methoden zur Steuerung des Threads mußt Du in der Komponentenklasse realisieren und an das TThread-Objekt durchreichen.

    Das funzt ohne Probleme und löst Dein Problem vollständig.

    [Willkommen in der wunderbaren Welt von C# und Java ohne Mehrfachvererbung.]



  • Hallo Marc++us,
    vielen Dank für deine Info, ich werde das so machen.

    Evi48



  • Und wie verhindern die Framework-Klassen VCL und MFC Mehrfachvererbung?



  • Original erstellt von Marc++us:
    [Willkommen in der wunderbaren Welt von C# und Java ohne Mehrfachvererbung.]

    blaue oder rote pille?



  • Original erstellt von Marc++us:
    Also, es ist für VCL-Klassen (erkennbar am großen "T" im Namen) ebenso wie für MFC-Klassen (erkennbar am großen "C") verboten eine Mehrfachvererbung zu konstruieren.

    Das ist falsch. Ich habe schon mehrfach von MFC-Klassen abgeleitet. Z.B. von CMap und CMutex.



  • Original erstellt von <Frage>:
    Und wie verhindern die Framework-Klassen VCL und MFC Mehrfachvererbung?

    Die verhindern das doch nicht. Du kannst z.B. von MyListItem und CComboBox erben. Das geht ohne Probleme und kann in einigen Fällen ziemlich nützlich sein.

    EDIT: Hmmm, ich sollte vor dem Posten auch die 2. Seite lesen 🙄 😃 . über diesem Eintrag steht fast das gleiche...

    [ Dieser Beitrag wurde am 10.07.2003 um 11:18 Uhr von MaSTaH editiert. ]



  • [ Dieser Beitrag wurde am 10.07.2003 um 11:21 Uhr von MaSTaH editiert. ]



  • Aber Marc++us hatte geschrieben:

    Die Framework-Klassen erlauben es nicht.



  • 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


Anmelden zum Antworten