<?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[MV &amp;quot;Diamond of death&amp;quot; - auch gefährlich bei rein abstrakten Klassen?]]></title><description><![CDATA[<p>Servus,</p>
<p>ich stehe gerade vor einer ziemlich fundamentalen Designentscheidung und habe entdeckt, dass ich dabei bin einen &quot;diamond of death&quot; zu konstruieren. Ich meine jedoch, dass er ungefährlich ist, da er in rein abstrakten Klassen (pure virtual Interfaces ohne membervariablen) auftritt.</p>
<p>Dennoch würde ich gerne mal eure Meinung hören.</p>
<p>Folgende Situation: Es gibt ein Klassentemplate A, das die Arbeit macht. Einige seiner Memberfunktionen sind völlig unabhängig vom konkreten Typ. Daher habe ich eine interface-Klasse IA mit rein virtuellen Funktionen, von der das Klassentemplate A erbt. Das erlaubt mir, die Instanzen in einem ptr_container von Interface-Pointern zu speichern und alles, was Typ-unabhängig ist, damit zu machen.</p>
<p>Jetzt habe ich aber weitere Funktionalität, die in A nichts zu suchen hat und auch im A-Interface nicht. Deshalb erbt B von A und fügt die Funktionalität hinzu, und ein neues Interface IB beschreibt wiederum die Typ-unabhängige-Funktionalität.<br />
Und da entsteht ein &quot;Diamond of death&quot;.</p>
<p>Aber ein paar Zeilen Code zeigen mehr als tausend Worte:</p>
<pre><code class="language-cpp">// Interface to class A
class IA{
public:
virtual void foo() = 0;
// hier gibts KEINE Membervariablen
}

// template class A:
template &lt;typename T&gt;
class A&lt;T&gt;: public Base&lt;T&gt;, public IA, private boost::noncopyable {
public: virtual void foo() { dosomething(); }
// hier gibt es membervariablen
}
</code></pre>
<p>Dann gibts die abgeleiteten Klassen:</p>
<pre><code class="language-cpp">// Interface to B
class IB : public IA {
public: virtual void bar() = 0;
// hier gibt es KEINE membervariablen
}

// class B
template &lt;typename T&gt;
class B&lt;T&gt;: public A&lt;T&gt;, public IB
{
public: virtual void bar() {doSomethingElse();}
// hier gibt es Membervariablen
}
</code></pre>
<p>Jetzt entsteht ein diamond von B nach IA, nämlich:<br />
IA&lt;-A&lt;-B und andererseits IA&lt;-IB&lt;-B</p>
<p>Da IA und IB abstrakte Klassen ohne Membervariablen sind, halte ich das für nicht gefährlich, lasse mich aber gerne von Euch eines besseren belehren.</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242579/mv-quot-diamond-of-death-quot-auch-gefährlich-bei-rein-abstrakten-klassen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 18:19:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242579.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Jun 2009 12:40:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to MV &amp;quot;Diamond of death&amp;quot; - auch gefährlich bei rein abstrakten Klassen? on Fri, 05 Jun 2009 13:33:35 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>ich stehe gerade vor einer ziemlich fundamentalen Designentscheidung und habe entdeckt, dass ich dabei bin einen &quot;diamond of death&quot; zu konstruieren. Ich meine jedoch, dass er ungefährlich ist, da er in rein abstrakten Klassen (pure virtual Interfaces ohne membervariablen) auftritt.</p>
<p>Dennoch würde ich gerne mal eure Meinung hören.</p>
<p>Folgende Situation: Es gibt ein Klassentemplate A, das die Arbeit macht. Einige seiner Memberfunktionen sind völlig unabhängig vom konkreten Typ. Daher habe ich eine interface-Klasse IA mit rein virtuellen Funktionen, von der das Klassentemplate A erbt. Das erlaubt mir, die Instanzen in einem ptr_container von Interface-Pointern zu speichern und alles, was Typ-unabhängig ist, damit zu machen.</p>
<p>Jetzt habe ich aber weitere Funktionalität, die in A nichts zu suchen hat und auch im A-Interface nicht. Deshalb erbt B von A und fügt die Funktionalität hinzu, und ein neues Interface IB beschreibt wiederum die Typ-unabhängige-Funktionalität.<br />
Und da entsteht ein &quot;Diamond of death&quot;.</p>
<p>Aber ein paar Zeilen Code zeigen mehr als tausend Worte:</p>
<pre><code class="language-cpp">// Interface to class A
class IA{
public:
virtual void foo() = 0;
// hier gibts KEINE Membervariablen
}

// template class A:
template &lt;typename T&gt;
class A&lt;T&gt;: public Base&lt;T&gt;, public IA, private boost::noncopyable {
public: virtual void foo() { dosomething(); }
// hier gibt es membervariablen
}
</code></pre>
<p>Dann gibts die abgeleiteten Klassen:</p>
<pre><code class="language-cpp">// Interface to B
class IB : public IA {
public: virtual void bar() = 0;
// hier gibt es KEINE membervariablen
}

// class B
template &lt;typename T&gt;
class B&lt;T&gt;: public A&lt;T&gt;, public IB
{
public: virtual void bar() {doSomethingElse();}
// hier gibt es Membervariablen
}
</code></pre>
<p>Jetzt entsteht ein diamond von B nach IA, nämlich:<br />
IA&lt;-A&lt;-B und andererseits IA&lt;-IB&lt;-B</p>
<p>Da IA und IB abstrakte Klassen ohne Membervariablen sind, halte ich das für nicht gefährlich, lasse mich aber gerne von Euch eines besseren belehren.</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721737</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Fri, 05 Jun 2009 13:33:35 GMT</pubDate></item><item><title><![CDATA[Reply to MV &amp;quot;Diamond of death&amp;quot; - auch gefährlich bei rein abstrakten Klassen? on Fri, 05 Jun 2009 13:45:37 GMT]]></title><description><![CDATA[<p>Was soll dann passieren, wenn ein IA eine Funktion aufruft, welche in A und IB überschrieben wird?</p>
<p>btw:<br />
Es gibt noch die virtuelle Vererbung, damit du keine zwei A Objekte pro B hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721775</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 05 Jun 2009 13:45:37 GMT</pubDate></item><item><title><![CDATA[Reply to MV &amp;quot;Diamond of death&amp;quot; - auch gefährlich bei rein abstrakten Klassen? on Fri, 05 Jun 2009 13:51:30 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Was soll dann passieren, wenn ein IA eine Funktion aufruft, welche in A und IB überschrieben wird?</p>
</blockquote>
<p>Genau das passiert ja nicht, da in IB keine Funktionen definiert werden, die schon in IA definiert sind. Wäre ja auch quatsch.<br />
Mit IA kann man Funktionen aufrufen, die in A definiert sind, und mit IB kann man Funktionen aufrufen, die in B oder A definiert sind.</p>
<blockquote>
<p>btw:<br />
Es gibt noch die virtuelle Vererbung, damit du keine zwei A Objekte pro B hast.</p>
</blockquote>
<p>Wieso soll B zwei A-Objekte enhalten? Es enthielte höchstens zwei IA-Objekte. Aber da die keine Membervariablen haben, ist virtuelle Verebung unnötig, dachte ich (entsprechend Meyers, Kapitel 6, Tipp40 zu MI).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721779</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Fri, 05 Jun 2009 13:51:30 GMT</pubDate></item><item><title><![CDATA[Reply to MV &amp;quot;Diamond of death&amp;quot; - auch gefährlich bei rein abstrakten Klassen? on Fri, 05 Jun 2009 14:21:36 GMT]]></title><description><![CDATA[<blockquote>
<p>Genau das passiert ja nicht, da in IB keine Funktionen definiert werden, die schon in IA definiert sind. Wäre ja auch quatsch.</p>
</blockquote>
<p>Das scheine ich bei dir überlesen zu haben..</p>
<blockquote>
<p>Wieso soll B zwei A-Objekte enhalten? Es enthielte höchstens zwei IA-Objekte.</p>
</blockquote>
<p>Jup, meinte IA.</p>
<blockquote>
<p>aber da die keine Membervariablen haben, ist virtuelle Verebung unnötig, dachte ich (entsprechend Meyers, Kapitel 6, Tipp40 zu MI).</p>
</blockquote>
<p>Da steht aber nichts davon, dass virtuelle Vererbung nicht nötig ist, wenn die Basis keine Daten enthält.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Probier sonst mal das hier:</p>
<pre><code class="language-cpp">IA* = new B;
</code></pre>
<p>Dann siehst du, dass es mehrere IA's gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721805</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 05 Jun 2009 14:21:36 GMT</pubDate></item><item><title><![CDATA[Reply to MV &amp;quot;Diamond of death&amp;quot; - auch gefährlich bei rein abstrakten Klassen? on Tue, 09 Jun 2009 20:07:18 GMT]]></title><description><![CDATA[<p>Ich habe mein Design jetzt dahingehend geändert dass ich keine Mehrfachvererbung mehr an dieser Stelle habe...<br />
Auslösend war die Erkenntnis, dass es ein Anzeichen für schlechtes Design ist, wenn man länger als 15 Minuten braucht bis ein Kollege es verstanden hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724109</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Tue, 09 Jun 2009 20:07:18 GMT</pubDate></item><item><title><![CDATA[Reply to MV &amp;quot;Diamond of death&amp;quot; - auch gefährlich bei rein abstrakten Klassen? on Tue, 09 Jun 2009 20:20:57 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>Auslösend war die Erkenntnis, dass es ein Anzeichen für schlechtes Design ist, wenn man länger als 15 Minuten braucht bis ein Kollege es verstanden hat.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724115</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 09 Jun 2009 20:20:57 GMT</pubDate></item></channel></rss>