<?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[„is-implemented-in-terms-of“: Komposition vs. Vererbung]]></title><description><![CDATA[<p>Hallo,</p>
<p>soweit ich das sehe, gibt es zwei grundsätzliche Möglichkeiten, IIITO zu implementieren: Via Komposition und via private (oder öffentliche, die ich außer Acht lasse) Vererbung.</p>
<p><a href="http://www.gotw.ca/gotw/060.htm" rel="nofollow">GOTW #60</a> argumentiert, dass Komposition den Vorteil hat, eine Ausnahme-sichere Implementierung von op= zu vereinfachen.</p>
<p>Nur: Wo sind die Vorteile der privaten Vererbung? Oder: wieso benutzt man nicht *immer* Komposition und vergisst private Vererbung? Gibt es Unterschiede in der Performance?</p>
<p>Letztendlich läuft es bei mir darauf hinaus, dass ich ein Klassentemplate A mittels Klassentemplate B implementiere. Zufällig haben diese beiden Klassen aber eine *identische* (!) Interface. Am liebsten würde ich also folgendes schreiben:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; using A = detail::B&lt;T&gt;;
</code></pre>
<p>Da das noch nicht funktioniert, wähle ich halt den Umweg über IIITO. Klasse B hat übrigens einen Ausnahmen-sicheren op= (ich benutzte die Implementierung via 'swap' die in „Effective C++“ vorgestellt ist). D.h. das Argument aus GOTW #60 trifft bei mir nicht zu. Soll ich trotzdem Komposition verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/202975/is-implemented-in-terms-of-komposition-vs-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 08:36:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202975.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 17 Jan 2008 13:37:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to „is-implemented-in-terms-of“: Komposition vs. Vererbung on Thu, 17 Jan 2008 13:37:05 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>soweit ich das sehe, gibt es zwei grundsätzliche Möglichkeiten, IIITO zu implementieren: Via Komposition und via private (oder öffentliche, die ich außer Acht lasse) Vererbung.</p>
<p><a href="http://www.gotw.ca/gotw/060.htm" rel="nofollow">GOTW #60</a> argumentiert, dass Komposition den Vorteil hat, eine Ausnahme-sichere Implementierung von op= zu vereinfachen.</p>
<p>Nur: Wo sind die Vorteile der privaten Vererbung? Oder: wieso benutzt man nicht *immer* Komposition und vergisst private Vererbung? Gibt es Unterschiede in der Performance?</p>
<p>Letztendlich läuft es bei mir darauf hinaus, dass ich ein Klassentemplate A mittels Klassentemplate B implementiere. Zufällig haben diese beiden Klassen aber eine *identische* (!) Interface. Am liebsten würde ich also folgendes schreiben:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; using A = detail::B&lt;T&gt;;
</code></pre>
<p>Da das noch nicht funktioniert, wähle ich halt den Umweg über IIITO. Klasse B hat übrigens einen Ausnahmen-sicheren op= (ich benutzte die Implementierung via 'swap' die in „Effective C++“ vorgestellt ist). D.h. das Argument aus GOTW #60 trifft bei mir nicht zu. Soll ich trotzdem Komposition verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1438386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1438386</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 17 Jan 2008 13:37:05 GMT</pubDate></item><item><title><![CDATA[Reply to „is-implemented-in-terms-of“: Komposition vs. Vererbung on Thu, 17 Jan 2008 15:07:07 GMT]]></title><description><![CDATA[<p>Ich glaube Herb Sutter war es in Exceptional C++ Style, der folgendes Beispiel angebracht hat, wo es ohne Vererbung nicht geht.</p>
<pre><code class="language-cpp">/* Eine Klasse habe folgendes Interface */
class Timer
{
protected:
    void Start(int ms);

    virtual void OnTick() = 0;
};
</code></pre>
<p>Bei einer Klasse, die diesen Timer wiederverwenden möchte (die in-terms-of Timer implementiert ist) geht es nicht mit Komposition.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1438480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1438480</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 17 Jan 2008 15:07:07 GMT</pubDate></item><item><title><![CDATA[Reply to „is-implemented-in-terms-of“: Komposition vs. Vererbung on Thu, 17 Jan 2008 15:11:42 GMT]]></title><description><![CDATA[<p>Hallo LJ,</p>
<p>stimmt, in Deinem Beispiel ist das etwas anderes. Gut, dann werde ich halt Komposition verwenden. Die Performance sollte ja eigentlich wirklich identisch sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1438484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1438484</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 17 Jan 2008 15:11:42 GMT</pubDate></item><item><title><![CDATA[Reply to „is-implemented-in-terms-of“: Komposition vs. Vererbung on Thu, 17 Jan 2008 15:13:56 GMT]]></title><description><![CDATA[<p>Ich such's heute abend mal exakt raus, aber ich meine er schreibt sinngemäß, dass die Notwendigkeit der Implementierung einer abstrakten Methode für ihn der einzige Grund wäre, keine Komposition zu verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1438485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1438485</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 17 Jan 2008 15:13:56 GMT</pubDate></item><item><title><![CDATA[Reply to „is-implemented-in-terms-of“: Komposition vs. Vererbung on Thu, 17 Jan 2008 16:02:43 GMT]]></title><description><![CDATA[<p>Gut, dass du oeffentliche Vererbung aussen vorlaesst, denn das waere kein IIITO mehr, sondern Is-A, und damit was anderes.<br />
Wie du schon schreibst, wird IIITO im Allgemeinen mit Komposition geregelt, die einzigen Ausnahmen sind Situationen, in denen die Komposition nicht ausreicht. Das ist<br />
Situation a): Du benoetigst Zugriff auf protected member, den du nur durch Vererbung bekommst.<br />
Situation b): Du willst virtuelle Methoden ueberladen</p>
<p>Wobei du Situation b) meist auch dadurch hinbiegen kannst, dass du deiner Klasse eine private Klasse gibst, die oeffenltich erbt und die virtuelle Methoden ueberschreibt, und dann eine Instanz per Komposition benutzt:</p>
<pre><code class="language-cpp">class VirtualDings {
public: 
  virtual void foo();
};

//Variante A: Erben zum ueberladen
class VA : private VirtualDings{
public:
  void bar() {foo();}
private:
  virtual void foo(); //VirtualDings::foo() ueberladen
};

//Variante B: Privates Member das ueberlaedt.
class VB {
public:
  void bar() {ol.foo();}
private:
  class Overload : public VirtualDings {
  public:
    virtual void foo();
  };
  Overload ol;  //komposition
}
</code></pre>
<p>Situation c): Du willst die Empty Base Class Optimization nutzen. Wenn die Klasse, mit der du deine Klasse implementieren moechtest, nur aus Methoden besteht und keine eigenen Daten beinhaltet, verbraucht sie als Member dennoch Platz. Als Basisklasse faellt das weg, wenn der Compiler EBCO implementiert hat.<br />
Bsp:</p>
<pre><code class="language-cpp">struct Empty {
  void foo();
};

struct Inherits : private Empty {
  int i;
};  //sizeof(Inherits) = sizeof(int)

struct Komposes {
  int i;
  Empty e;
}; //sizeof(Inherits) &gt; sizeof(int)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1438527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1438527</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 17 Jan 2008 16:02:43 GMT</pubDate></item><item><title><![CDATA[Reply to „is-implemented-in-terms-of“: Komposition vs. Vererbung on Thu, 17 Jan 2008 16:24:07 GMT]]></title><description><![CDATA[<p>Hi pumuckl,</p>
<p>alles klar: weder a, noch b, noch c treffen bei mir zu. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /> =&gt; Komposition.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1438538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1438538</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 17 Jan 2008 16:24:07 GMT</pubDate></item><item><title><![CDATA[Reply to „is-implemented-in-terms-of“: Komposition vs. Vererbung on Thu, 17 Jan 2008 18:44:36 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p><a href="http://www.gotw.ca/gotw/060.htm" rel="nofollow">GOTW #60</a> argumentiert, dass Komposition den Vorteil hat, eine Ausnahme-sichere Implementierung von op= zu vereinfachen.</p>
</blockquote>
<p>Im Prinzip ist der Artikel in dieser Hinsicht allerdings nicht überzeugend (der Entsprechende Artikel in Exceptional C++ ist besser).. Einerseits wird Ableitung von U vs. Zeiger auf U als Member gegenübergestellt - das ist nicht gerade Inheritance vs. Containment, denn dann müsste der Member vom Typ U sein. Die Sache mit der Exceptionsicherheit ist auch unklar. Die Variante mit Zeiger benutzt im Prinzip eine Form von Copy&amp;Swap (das Swap ist ausgeschrieben und wird nicht in eine eigene Funktion verlagert, da ja der Zeiger auch ein roher ist) - Nichts hindert uns daran, genau das Gleiche bei Ableitung durchzuführen. Was Exceptionsicherheit angeht, ist ein Basisklassenmember im Prinzip ein normaler Member, der nur keinen eigenen Namen hat, wäre U ein normaler Member, würde die Argumentation nicht anders aussehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1438600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1438600</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 17 Jan 2008 18:44:36 GMT</pubDate></item></channel></rss>