2011-01-05 10 views
1

Warum ist die folgende Vererbungsstruktur in C++ nicht zulässig?C++ - Unterklasse, die von Klassen abgeleitet ist, die von derselben Klasse abgeleitet sind

  • SON1 leitet sich von Father1
  • Son2 leitet sich von Father1
  • GrandSon1 von SON1 und Son2 leitet

Wenn es könnte ein Fall sein, wenn dies legitim ist (vielleicht, wenn alle Klassen rein- sind virtuell bis auf GrandSon1), was sind sie und wie kommt es?

+0

Was genau meinen Sie mit "nicht legitim"? – Jon

+0

Warum ist es nicht legitim? Siehe: http://www.parashift.com/c++faq-lite/multiple-inheritance.html#faq-25.8 (25.8 und 25.9) – badgerr

+5

Illegate 'Son' ==' Bastard'? –

Antwort

7

Sie liegen falsch, dies ist in C++ völlig legal. Sie könnten jedoch in virtual inheritance schauen.

3

Diese Vererbungshierarchie der diamond of death genannt wird, und es ist legal in C++, wenn Sie virtuelle Vererbung verwenden, obwohl es in der Regel ist nach wie vor problematisch.

+0

Diese Antwort macht die Programmierung in C++ beeindruckend gefährlich. –

+3

@Space: C++ * ist beeindruckend gefährlich. –

-2

Ich denke, Sie verwechseln Klassenhierarchie und Klasseninstanz.

ein „Enkel“ Klasse von einem „Sohn“ Klasse abgeleitet, sondern eine Instanz eines „Enkel“ kann von 2 Instanzen der Klasse „Sohn“

In jedem Fall nicht sein, ich glaube, Sie sollten nicht Mach es so, weil du irgendwann eine Klasse "Urenkel" und eine Klasse "Urenkel" haben wirst.

Die Beziehung zwischen Eltern und Geschwistern auf andere Weise herstellen.

+4

-1: Ich denke, Sie verwechseln C++ mit einer Sprache, die keine Mehrfachvererbung unterstützt. –

+0

@ Space_C0wb0y: Seien Sie sicher, dass Sie C++ nicht zu einer Sprache verwechseln, die es * richtig unterstützt * –

+0

vielleicht war ich in der Formulierung der ursprünglichen Frage verwirrt. Vater gegen Basis, Sohn gegen abgeleitete ... – Max

1

Dies ist die typische Vererbung Diamant. Es tritt sogar in der Standardbibliothek auf, in der iostream sowohl von istream als auch von ostream stammt und beide von ios_base abgeleitet sind.

Es gibt verschiedene Probleme:

  • Wenn Vater eine virtuelle Methode hat und beide SON1 und Son2 es zu implementieren, es sei denn, Grandson es auch implementiert er es implementiert, die von SON1 und Son2 Methoden zu erklären hat.

  • Wenn Vater irgendwelche Datenmitglieder hat, würde Grandson sie zweimal bekommen.

  • In jedem Fall Vater hat eine V-Tabelle, so dass Sie scheinen, um 2 Kopien davon zu bekommen.

Die mittleren Klassen verwenden daher in der Regel virtuelle Vererbung, die heikel, aber effektiv bedeutet, dass nur die letzte Klasse der Basisklasse erhält. In diesem Fall ist Grandson selbst dafür verantwortlich, Vater zu konstruieren, und man nimmt an, dass er es "hat".

Es gibt weitere Probleme, die Sie beachten sollten, wenn Sie irgendwelche Zeiger werfen. Seien Sie besonders vorsichtig beim Gießen in und aus einem Hohlraum *.

Verwandte Themen