<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Diamond-Problem</id>
	<title>Diamond-Problem - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Diamond-Problem"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Diamond-Problem&amp;action=history"/>
	<updated>2026-05-19T10:10:15Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Diamond-Problem&amp;diff=535648&amp;oldid=prev</id>
		<title>imported&gt;Ulanwp: Fehlenden Sprachparameter eingefügt</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Diamond-Problem&amp;diff=535648&amp;oldid=prev"/>
		<updated>2026-02-26T12:50:34Z</updated>

		<summary type="html">&lt;p&gt;Fehlenden Sprachparameter eingefügt&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Datei:Diamond inheritance.svg|mini|hochkant|Vererbungsbeziehungen beim Diamond-Problem]]&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;Diamond-Problem&amp;#039;&amp;#039;&amp;#039; entsteht durch [[Mehrfachvererbung]] in der [[Objektorientierte Programmierung|Objektorientierten Programmierung]] und [[Wissensmodellierung]]. Es kann auftreten, wenn eine [[Klasse (objektorientierte Programmierung)|Klasse]] &amp;#039;&amp;#039;D&amp;#039;&amp;#039; auf zwei verschiedenen Vererbungspfaden (&amp;#039;&amp;#039;B&amp;#039;&amp;#039; und &amp;#039;&amp;#039;C&amp;#039;&amp;#039;) von ein und derselben [[Basisklasse]] &amp;#039;&amp;#039;A&amp;#039;&amp;#039; abstammt. Zeichnet man die Vererbungsbeziehungen zwischen den Klassen als Diagramm, so ergibt sich die Form einer [[Raute]] (englisch &amp;#039;&amp;#039;rhombus&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;diamond&amp;#039;&amp;#039;), nach der das Diamond-Problem benannt ist.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Die Probleme der Mehrfachvererbung lassen sich am Beispiel eines [[Amphibienfahrzeug]]s verdeutlichen, das sowohl die Eigenschaften eines &amp;#039;&amp;#039;Land-&amp;#039;&amp;#039; als auch die eines &amp;#039;&amp;#039;Wasserfahrzeuges&amp;#039;&amp;#039; erbt. Das Diamond-Problem tritt hierbei auf, wenn beide von der Klasse &amp;#039;&amp;#039;Fahrzeug&amp;#039;&amp;#039; abstammen, die eine Methode des Fortbewegens sowie die Eigenschaften Höchstgeschwindigkeit und Sitzplätze (für Insassen) besitzt. Die Frage ist nun, ob sich ein Amphibienfahrzeug&lt;br /&gt;
# wie ein Land- &amp;#039;&amp;#039;oder&amp;#039;&amp;#039; ein Wasserfahrzeug oder&lt;br /&gt;
# wie ein Land- &amp;#039;&amp;#039;und&amp;#039;&amp;#039; ein Wasserfahrzeug fortbewegt.&lt;br /&gt;
&lt;br /&gt;
Außerdem variiert die Höchstgeschwindigkeit je nach Verwendung, die Anzahl der Sitzplätze aber nicht. Es wäre also sinnvoll, für erstere zwei verschiedene, für letztere aber nur einen Wert zu speichern. Die erste Mehrdeutigkeit kann nur im Einzelfall gelöst werden; so hat ein Amphibienfahrzeug beispielsweise &amp;#039;&amp;#039;zwei&amp;#039;&amp;#039; Fortbewegungsarten (-methoden), obwohl &amp;#039;&amp;#039;Fahrzeug&amp;#039;&amp;#039; nur eine &amp;#039;&amp;#039;Fortbewegungsart&amp;#039;&amp;#039; hat.&lt;br /&gt;
&lt;br /&gt;
== Modellierung in C++ ==&lt;br /&gt;
&lt;br /&gt;
In C++ ist es möglich, bei Definition der Klassen B und C anzugeben, ob sie sich eine gemeinsame Instanz der Klasse A teilen sollen (Diamond), oder ob sie jeweils ihre eigene Instanz besitzen sollen (normale Mehrfachvererbung):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Diamond-Vererbung !! Normale Mehrfachvererbung&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class A {&lt;br /&gt;
   int a;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class B: virtual A {&lt;br /&gt;
   int b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class C: virtual A {&lt;br /&gt;
   int c;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class D: B, C {&lt;br /&gt;
   int d;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class A {&lt;br /&gt;
   int a;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class B: A {&lt;br /&gt;
   int b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class C: A {&lt;br /&gt;
   int c;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class D: B, C {&lt;br /&gt;
   int d;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:Diamond inheritance.svg|90px|]]&lt;br /&gt;
| [[Datei:No diamond inheritance.svg|90px|]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| Speicherlayout:&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:Diamond inheritance layout.svg]]&amp;lt;br /&amp;gt; Die Klassen &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; und &amp;#039;&amp;#039;&amp;#039;C&amp;#039;&amp;#039;&amp;#039; haben jeweils einen Verweis auf Member der Oberklasse &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; und haben Zugriff auf ein und dieselbe Variable &amp;#039;&amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;#039; der Oberklasse &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
| [[Datei:Non-diamond inheritance layout.svg]]&amp;lt;br /&amp;gt; Die Klassen &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; und &amp;#039;&amp;#039;&amp;#039;C&amp;#039;&amp;#039;&amp;#039; haben jeweils ihre eigenen Kopien der Member der Oberklasse &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; und damit Zugriff auf zwei unterschiedliche Variablen &amp;#039;&amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Vermeidung ==&lt;br /&gt;
Wegen der Probleme, die bei Mehrfachvererbung auftreten können, unterstützen einige objektorientierte Programmiersprachen keine Mehrfachvererbung. Teilweise werden Alternativkonzepte angeboten, wie zum Beispiel die Konstruktion von [[Zwillingsklasse]]n. Die Programmiersprache [[Eiffel (Programmiersprache)|Eiffel]] bietet Konstrukte (renaming) zur transparenten Auflösung der bei Mehrfachvererbung auftretenden Namenskonflikte. [[Smalltalk (Programmiersprache)|Smalltalk]] und [[Oberon (Programmiersprache)|Oberon]] verbieten Mehrfachvererbung. [[Java (Programmiersprache)|Java]], die [[.Net-Framework|.NET-Sprachen]] oder auch [[Object Pascal]] lassen keine Mehrfachvererbung zu, bieten jedoch einen speziellen Typ der [[Abstrakte Klasse|abstrakten Klasse]] an, das [[Schnittstelle (Programmierung)|Interface]], von dem mehrfach geerbt werden kann. Im Unterschied zur Vererbung von Klassen wird hier nur die Deklaration vererbt, nicht die Implementierung der Funktionen und vor allem keine Membervariablen. Ab Java&amp;amp;nbsp;8 kann ein Interface auch Methoden beinhalten, jedoch können diese keine Membervariablen verwenden.&amp;lt;ref&amp;gt;[https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html docs.oracle.com]&amp;lt;/ref&amp;gt; [[C++]] bietet das Konzept der &amp;#039;&amp;#039;virtuellen Basisklasse&amp;#039;&amp;#039;, wodurch eine Replikation der Member der Basisklasse in der abgeleiteten Klasse vermieden wird. [[PHP]] benutzt unter dem Begriff „horizontal reuse“ (Horizontale Wiederverwendung) ab der Version 5.4  sogenannte [[Trait (Programmierung)|Traits]], welche lose Klassenfragmente sind und in andere Klassen eingebunden werden können.&amp;lt;ref&amp;gt;[https://stefan-marr.de/2010/12/php-next-traits-presentation-for-afup-in-paris/ stefan-marr.de]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[https://wiki.php.net/rfc/horizontalreuse wiki.php.net]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* {{cite journal |last=Eddy Truyen |coauthors=Wouter Joosen, Bo Jørgensen, Petrus Verbaeten |title=A Generalization and Solution to the Common Ancestor Dilemma Problem in Delegation-Based Object Systems |journal=Proceedings of the 2004 Dynamic Aspects Workshop |pages=103–119 |date=2004 |language=en}}&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Objektorientierte Programmierung]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Ulanwp</name></author>
	</entry>
</feed>