2009-03-18 11 views
2

Ich habe es nie in der professionellen Software verwendet, obwohl wir in unserem Geschäft und anderen, für die ich gearbeitet habe, große Systeme entwerfen. Das einzige Mal, dass ich mich mit virtueller Vererbung beschäftigt habe, war während meines Interviews in einer Firma. Nichtsdestotrotz habe ich in der Nachmittagszeit mit ihm gespielt.Virtuelle Vererbung in C++ - Verwendungen/Tricks

Benutzen Sie es? Verstehst du, wie es funktioniert (wie die meisten gängigen Compiler-Anbieter es implementieren)? Ich würde wirklich gerne wissen, wie es in professioneller Software verwendet wird, wenn überhaupt. Tricks und Tipps würden auch geschätzt werden.

Für mich war virtuelle Vererbung nur eine Lösung für ein berüchtigtes Diamantproblem. Daher hat es in unserer Software nie seinen Weg gefunden, da wir in unserem Architektur-MI keinen Diamanten haben.

Danke.

Antwort

6

Der Hauptpunkt bei der virtuellen Vererbung besteht darin, zu verhindern, dass abgeleitete Klassen mehrere Kopien verschiedener höherer Klassen erben. Dies kann in jedem Fall auftreten, in dem es mehrere Vererbungen geben kann - wie Sie richtig bemerken, das "Diamantproblem", das heißt, wo das Vererbungsdiagramm eine DAG anstelle eines strikten Baums ist.

Die C++ FAQ goes into it in some detail. Ich würde auch das C++ FAQ Buch empfehlen; Ich habe für die Autoren gearbeitet und sie sind ziemlich gut.

+0

+1 für das Buch und die Seite, ich habe die eine & häufig die andere :-) Kluge Leute, die Dinge gut erklären können ... die 2 oft nicht zusammen gehen. – Dan

2

Ich sehe nicht, warum Sie es verwenden möchten, wenn Ihre Architektur keine Mehrfachvererbung verwendet.

Wenn Sie zufällig verwendet MI Ich kann nicht sehen, warum Sie nicht virtuelle Vererbung verwenden. Es scheint keinen Nachteil zu geben, außer daran zu erinnern, das virutal-Schlüsselwort an den richtigen Stellen hinzuzufügen.

+0

Hier sind zwei Gründe: 1) virtuelle Vererbung erfordert Unterklassen zu beachten (und wenn Sie virtuelle Basen umgestalten, hat es Auswirkungen auf alle Ihre Benutzer unnötig). 2) Die virtuelle Vererbung fügt jedem Konstruktor und Destruktor Laufzeitkosten hinzu. Warum diese Kosten bezahlen, wenn es fast nie nötig ist? – Tom

+0

Können Sie erklären, wie das Refactoring virtueller Basen anders ist als das Refactoring normaler Basen in einer Diamantenvererbungssituation? Für den Konstruktor Kosten, ist es nicht schneller, weil bei der Verwendung einer nicht virtuellen Basisklasse mehrere Kopien der Basis erstellt werden müssen, während mit virtuellen es nur Zeiger ist? – LegendLength

+1

Ein weiterer Nachteil der virtuellen Vererbung ist, dass Sie nicht länger von Zeiger zu Base zu Zeiger zu Abgeleitet mit statischem_cast reduzieren können. Sehen Sie diesen leuchtenden Beitrag für Details: http://groups.google.com/group/comp.lang.c++.moderated/msg/631ac4837db0abbb –

5

Ich habe es nie benutzt in der professionellen Software, auch wenn in unserem Geschäft,

Haben Sie iostream verwenden? Wir tun es. Schau dir das Design von iostreams an und du wirst wissen, dass du virtuelle Vererbung benutzt hast.

+0

HAHAH, ja indirekt wir verwenden es :) –

3

Die virtuelle Vererbung kann auch verwendet werden, um eine Klasse zu einer finalen Klasse zu machen, d. H. Um sie so zu machen, dass keine anderen Klassen daraus abgeleitet werden können. Ich habe diesen Trick einmal von Stroustroup (http://www.research.att.com/~bs/bs_faq2.html#no-derivation) genommen.

0

Ich habe mit mehreren kommerziellen Bibliotheken gearbeitet, die ihre Verwendung erforderten. Zum Beispiel benötigte die Bibliothek, die Reuters für den Zugriff auf Echtzeit-Finanzmarktdaten zur Verfügung gestellt hat, dass Sie Ihre Listening-Klassen aus mehreren Basisklassen ableiten müssen (weiß nicht, ob dies immer noch der Fall ist) und diese virtuelle Vererbung benötigt. Es war keine große Sache, sobald Sie realisierten, dass Sie es benutzen mussten - eine Tatsache, die nicht völlig gut dokumentiert ist.