Warum erben Qt-Klassen nicht virtuell von QObject?

Verschiedenes zu Qt
Antworten
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

Warum erben Qt-Klassen nicht virtuell von QObject?

Beitrag von The User »

Der Titel sagt alles...
Unzählige Klassen erben von QObject, klar dass es dort in wenigen Fällen zu Mehrfachvererbung von QObject kommen kann, bloß Qt will das nicht, obwohl virtuelle Vererbung so einfach ist, ist ja das Problem der erbenden Klasse, den Konstruktor zu regeln.

Viele liebe Grüße
The User
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Das ist nicht ganz so einfach.. ich versuch's mal:
Warum erben Qt-Klassen nicht virtuell von QObject?
Weil virtuelles Erben nur bei multipler Vererbung sinnvoll ist, und genau dieses bei Qt nicht erlaubt ist. Daraus resultiert also die Frage:

Warum ist Mehrfachvererbung bei QObjecten nicht erlaubt?

Weil die Verwaltung der Metadaten der QObjecten (Signals/Slots/Properties/Parents) sehr viel aufwendiger würde, respektive teilweise in dieser Form sogar unmöglich wäre. "Signals" sind z.B. protected Methoden und wären bei Mehrfachvererbung nicht mehr eindeutig aufzurufen (Abbruch durch den Compiler wegen mehrdeutiger Methode).
obwohl virtuelle Vererbung so einfach ist
Das kann man so nicht sagen... die Konstruktoren spielen dabei eine untergeordnete Rolle... viel schwieriger sind jedoch die Destruktoren... Denk mal an verwaltete (und bei virtueller Vererbung plötzlich nur noch einmal vorhandene) Pointer...
klar dass es dort in wenigen Fällen zu Mehrfachvererbung von QObject kommen kann,
Das ist eben _nicht_ so klar.... die gewonnene Flexibilität wird leider mit vielen Problemen "bezahlt". Die Mehrfachvererbung lässt viele hässliche Strukturen zu (z.B. den "Diamond of Death"). Weil sich solche Designprobleme üblicherweise relativ leicht lösen lassen (z.B. Aggregation anstelle von Vererbung), haben die Entwickler anderer Programmiersprachen daher dieses Feature gar nicht erst übernommen...

hth!
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

Beitrag von The User »

Manchmal ist mehrfach-Vererbung eben sinnvoll.
Mixins gibt es in C++ eben auch nicht, Aggregation ist nicht immer das Schnellste und sinnvollste.
Aber jetzt erklär mir mal das Problem mit den Metadaten genauer?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Manchmal ist mehrfach-Vererbung eben sinnvoll.
Mixins gibt es in C++ eben auch nicht, Aggregation ist nicht immer das Schnellste und sinnvollste.
Aber mit c++ kennst du dich schon bissi intensiver aus , oder ?
Was ist denn z.B. schneller wie Aggregation/Composition als alternative zur multiplen vererbung (also das verwendete Object wird definitiv mitangelegt) ???
Aber jetzt erklär mir mal das Problem mit den Metadaten genauer?
Arbeite mal in nem programm mit Methodenpointer, und dann bau da mal multiple vererbung ein. Dann bekommst vielleicht nen gefuehl fuer, warum multiple vererbung in dem umfeld keine so gute idee ist. zumal es designtechnich doch immer recht einfach zu umgehen ist.

Ciao ...
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

Beitrag von The User »

Ein Bissi intensiver kenn ich mich aus, habe aber noch nie einen Compiler gebaut oder versucht ein eigenes Speichermodell zu entwerfen.
Delegation hat einen Geschwindigkeitsnachteil und für Polymorphen Zugriff muss man sich dann erstmal eine Klasse ohne Daten, rein virtuell basteln.
Selbst Qt verwendet Mehrfachvererbung (z. B. QWidget), im Rahmen anderer Designpatterns als den von Qt vertretenen wie MVC, zum Beispiel bei Policy-Based Design ist mehrfache Vererbung, alternativ auch Mixins - als echtes Sprachkonstrukt wie z. B. in D-, erst Recht sinnvoll.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Ein Bissi intensiver kenn ich mich aus, habe aber noch nie einen Compiler gebaut oder versucht ein eigenes Speichermodell zu entwerfen.
So tief meinte ich nu auch wieder nich :-)
Delegation hat einen Geschwindigkeitsnachteil
Der aber an und ab wegoptimiert wird
für Polymorphen Zugriff muss man sich dann erstmal eine Klasse ohne Daten, rein virtuell basteln.
Wieso muss man ???
Oder meinst du der Compiler macht das ? Ich glaub eher nicht ...
Aber allein die Gedanken sind hier scho eigentlich verwerflich (designtechnisch gesehen).
Du willst auf Funktionalitaet von irgendwas zugreifen, und waehlst dazu den Weg ueber Polymorphie ???
Dabei solltest du Polymorphie genau entgegengesetzt verwenden, um funktinalitaet zur Laufzeit auszutauschen ....
Selbst Qt verwendet Mehrfachvererbung (z. B. QWidget)
Ich bin kein feind von multipler Vererbung. Man sollt es aber wirklich nur da einsetzen wo es einem was bringt.
WO und warum verwendet qt mehrfachvererbung ??? Meines wissens nach nur um den UI generierten code mit der Widget->basisfunktionalitaet zu verknuepfen .... und da auch nur weil sich damit code leichter generieren laesst.
Fuer handgeschriebenen Code eher ne zweifelhafte Motivation.

taucht bei handgeschriebenen code mehrfachvererbung auf, wollte der Urheber zu 90% erreichen:
Nen baukastensystem, wo er funktionalitaet einfach hinzu ... erben kann.
udn sich den schreibaufwand fuer die delegation an die composition sparen.

Polymorphie zum wiederverwenden von Code ? Schreibaufwand sparen ???

Aber zu dem Kernproblem noch mal ...
http://de.wikibooks.org/wiki/C++-Progra ... _Vererbung
es gibt A::methodeY()
du willst D::methodeY() mit irgendwas verbinden (connect) kein problem
jetzt heist aber vererbung das D sich sowohl wie B, als auch wie C verhalten muss
Also koenntest du auch C::methodeY() verbinden
und B::methodeY() mit was verbinden

Bist du sicher das der compiler bei allen versionen den selben methodenpointer verwendet?

Ciao ....
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

Beitrag von The User »

Erstmal danke, ich habe jetzt kapiert, welche Schwierigkeit das fürs moc wäre. ;)

Qt verwendet an einigen Stellen Mehrfachvererbung, QWidget erbt zum Beispiel von QPaintDevice und QObject. Das meinte ich.

Außerdem: Ein Baukasten ist ja nicht unbedingt schlimm. ;)
Natürlich macht Mehrfachvererbung Probleme, aber man sollte sich nicht ganz verschließen sondern vielmehr überlegen, das System zu verbessern. (Gibt übrigens Ansätze für einfachere Speichermodelle mit Mehrfachvererbung, weil einfache Vererbung bis jetzt einfacher ist, siehe hier)

Eigentlich kommt man ja ganz gut aus und kann sich freuen, dass man in C++ nicht nur von so primitiven Interfaces - die oft einfach unpraktisch und der Semantik nicht entsprechend sind - mehrfach erben kann.
Antworten