<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Frage zur Mehrfachvererbung]]></title><description><![CDATA[<p>Hallo, ich frage mich wie folgendes Szenario vom Kompiler gehandhabt wird:</p>
<p>Folgende Klassen gibt es:</p>
<p>class AStyle {...};<br />
class BStyle : public AStyle {...};</p>
<p>und</p>
<p>class A : public AStyle {...};<br />
class B : public A, public BStyle {...};</p>
<p>Die Klasse B erbt jetzt ja sozusagen doppelt von AStyle, einmal durch die Klasse A und einmal durch die Klasse BStyle.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274642/frage-zur-mehrfachvererbung</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 08:45:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274642.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 29 Sep 2010 23:53:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zur Mehrfachvererbung on Wed, 29 Sep 2010 23:53:01 GMT]]></title><description><![CDATA[<p>Hallo, ich frage mich wie folgendes Szenario vom Kompiler gehandhabt wird:</p>
<p>Folgende Klassen gibt es:</p>
<p>class AStyle {...};<br />
class BStyle : public AStyle {...};</p>
<p>und</p>
<p>class A : public AStyle {...};<br />
class B : public A, public BStyle {...};</p>
<p>Die Klasse B erbt jetzt ja sozusagen doppelt von AStyle, einmal durch die Klasse A und einmal durch die Klasse BStyle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959273</guid><dc:creator><![CDATA[Student83]]></dc:creator><pubDate>Wed, 29 Sep 2010 23:53:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Mehrfachvererbung on Thu, 30 Sep 2010 00:35:59 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Es gibt einfach beide Definitionen gleichzeitig und jetzt muss man sich halt ueberlegen, welche man verwendet, wenn man einen Aufruf taetigt. Wenn man keinen qualifizierten Methodennamen durch Angabe der Klasse nutzt, weiss der Compiler nicht, was man moechte.</p>
<p>Interessant ist Folgendes:</p>
<pre><code class="language-cpp">class A {};

class B : public A {};
class C : public A {};

class D : public B, public C {};
</code></pre>
<p>Jetzt hat D indirekt zwei Mal das Zeug von A. Aber das kann man verschmelzen lassen!</p>
<pre><code class="language-cpp">class B : virtual public A {};
class C : virtual public A {};

class D : public A {};
</code></pre>
<p>Jetzt hat D die Methoden von A nur einmal. Toll, oder? Der ctor von A wird allerdings nicht mehr von B,C aufgerufen, da die virtuelle Vererbung dafuer sorgt, dass die von der virtuell ableitenden Klasse genutzte Basisklasse als Basisklasse der von ihr ableitenden Klasse bereitgestellt wird. D wird also direkter und nicht mehr indirekter Erbe von A, daher muss man auch in der Initialisierungsliste von D A initialisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959279</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 30 Sep 2010 00:35:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Mehrfachvererbung on Thu, 30 Sep 2010 07:02:23 GMT]]></title><description><![CDATA[<p>Hallo Eisflamme,</p>
<p>dein letztes Code-Beispiel sollte wohl eher so aussehen:</p>
<pre><code class="language-cpp">class B : virtual public A {};
class C : virtual public A {};

class D : public B, public C  // &lt;- das selbe wie bei dem ersten Code-Beispiel
{
  D() : B(), C(), A() {} // &lt;- dies meintest du wahrscheinlich, d.h. der Konstruktor von A muß jetzt von D aufgerufen werden
  // interessant wird dies natürlich erst bei Konstruktor-Parametern, z.B.
  D(int x) : B(), C(), A(x) {}
};
</code></pre>
<p>Jetzt teilen sich B und C die Basisklasse A, d.h. es gibt nur einen Speicher dafür (je Objekt selbstverständlich). Dies nennt man &quot;virtuelle Vererbung&quot;.<br />
Diesen Unterschied zwischen den beiden Möglichkeiten wird auch mittels des sogenannten &quot;Diamond of Death (DoD)&quot; ausgedrückt: <a href="http://en.wikipedia.org/wiki/Diamond_of_Death" rel="nofollow">http://en.wikipedia.org/wiki/Diamond_of_Death</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959315</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Thu, 30 Sep 2010 07:02:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Mehrfachvererbung on Thu, 30 Sep 2010 07:58:44 GMT]]></title><description><![CDATA[<p>Genau.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959337</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 30 Sep 2010 07:58:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Mehrfachvererbung on Thu, 30 Sep 2010 12:21:48 GMT]]></title><description><![CDATA[<p>Th69 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class B : virtual public A {};
class C : virtual public A {};

class D : public B, public C  // &lt;- das selbe wie bei dem ersten Code-Beispiel
{
  D() : B(), C(), A() {} // &lt;- dies meintest du wahrscheinlich, d.h. der Konstruktor von A muß jetzt von D aufgerufen werden
  // interessant wird dies natürlich erst bei Konstruktor-Parametern, z.B.
  D(int x) : B(), C(), A(x) {}
};
</code></pre>
</blockquote>
<p>Wobei zu beachten ist, dass virtuelle Basisklassen stets vor allen anderen direkten Basisklassen initialisiert werden (weil deren Konstruktion ja in der Regel voraussetzt, dass das virtuelle Basisklassenobjekt bereits fertig konstruiert wurde). Die Reihenfolge in der Intialisierungsliste sollte daher zweckmäßigerweise so aussehen:</p>
<pre><code class="language-cpp">D() : A(), B(), C() {}
  D(int x) : A(x), B(), C() {}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1959523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959523</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 30 Sep 2010 12:21:48 GMT</pubDate></item></channel></rss>