<?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[Statische und Dynamische Polymorphie: Weiter geht&#x27;s]]></title><description><![CDATA[<p>Hallo!<br />
Ich würde gerne mal weiter ein paar Meinungen/Ansichten/Vor-/Nachteile und Anwendungsbereiche zu diesem Thema hören, leider hat <a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1731061.html" rel="nofollow">dieses Thema</a> einfach in der Mitte aufgehört. <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="🙂"
    /><br />
Ich stelle einfach mal 2 Ansichten/Thesen in den Raum:</p>
<p>Legende:<br />
SP: Statische Polymorphie<br />
DP: ----''--- Polymorphie</p>
<p>1. <strong>DP verändert das OOP-Prinzip von C++</strong></p>
<p>Meines Erachtens schwächen Templates die strenge OO-Kapselung. Ein schönes Beispiel steht ja in ECP (&quot;Effektiv C++ Programmieren&quot;):</p>
<p>[cpp]<br />
template &lt;typename T&gt;<br />
class Rational;</p>
<p>template &lt;typename T&gt;<br />
Rational&lt;T&gt; doMultiply(const Rational&lt;T&gt; &amp;l, const Rational&lt;T&gt; &amp;r);</p>
<p>template &lt;typename T&gt;<br />
class Rational {<br />
public:<br />
...<br />
// friend, um gemischte Operatoren zu benutzen<br />
// wäre operator*() nicht in Rational definiert, würde beim Aufruf von<br />
// Rational&lt;int&gt; o = otherRational * 3<br />
// ein Compiler-Fehler kommen: 3 soll ein Rational&lt;int&gt; werden, de facto<br />
// kennt der Compiler int nicht, sondern nur T. Beim Einsatz einer Klasse ist<br />
// ihm bei der Deklaration des Operators sehr wohl T, also int, bekannt,<br />
// da T als int ja bei der Instanziierung der Klasse übergeben wird<br />
// implizit inline, da in Klasse definiert, ruft Helper wegen Blähcode auf<br />
friend const Rational operator *(const Rational &amp;l, const Rational &amp;r) {<br />
return doMultiply(l, r);<br />
}<br />
...<br />
};</p>
<p>// Helper, genaue Implementierung redundant<br />
Rational&lt;T&gt; doMultiply(const Rational&lt;T&gt; &amp;l, const Rational&lt;T&gt; &amp;r) {<br />
return Rational&lt;T&gt;(l.numerator() * r.numerator(), l.denominator() * r.demoniator());<br />
}<br />
[/cpp]</p>
<p>Friend bröckelt etwas an der Kapselung. Und nichts gegen Helper, aber die Klasse ist damit dann auch nicht mehr ganz unabhängig von dieser und später anderen Hilfsfunktionen. Für Polymorphismus gilt in dem Fall das selbe: man braucht friend-Funktionen, wenn wir Parameter implizit bei Funktionsübergabe in ein Objekt des Typs eines Klassentemplate konvertieren wollen. Oder wir nehmen kein friend, erstellen aber getter, die machen die Kapselung aber genauso etwas schwammiger. Nicht so dolle für strenge OOPler.</p>
<p>2. <strong>Statische Polymorphie benötigt man nur in der Bibliotheksentwicklung</strong></p>
<p>Da in modernen Programmen ja so gut wie alles vom Input abhängt, ist an Kompilierzeit-Polymorphismus ja gar nicht zu denken. Entwickelt man hingegen eine Bibliothek, ist der Kunde ja nicht der Benutzer, sondern der Programmierer, der seinen statischen Code niederschreibt und kompiliert. Er wird dynamische Polymorphie verwenden, weil sein Kunde der User ist, aber unsere statische Bibliothek wird immer statisch bleiben und holt damit Performance raus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/249790/statische-und-dynamische-polymorphie-weiter-geht-s</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 08:32:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/249790.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 12 Sep 2009 09:10:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Statische und Dynamische Polymorphie: Weiter geht&#x27;s on Sat, 12 Sep 2009 09:10:29 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich würde gerne mal weiter ein paar Meinungen/Ansichten/Vor-/Nachteile und Anwendungsbereiche zu diesem Thema hören, leider hat <a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1731061.html" rel="nofollow">dieses Thema</a> einfach in der Mitte aufgehört. <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="🙂"
    /><br />
Ich stelle einfach mal 2 Ansichten/Thesen in den Raum:</p>
<p>Legende:<br />
SP: Statische Polymorphie<br />
DP: ----''--- Polymorphie</p>
<p>1. <strong>DP verändert das OOP-Prinzip von C++</strong></p>
<p>Meines Erachtens schwächen Templates die strenge OO-Kapselung. Ein schönes Beispiel steht ja in ECP (&quot;Effektiv C++ Programmieren&quot;):</p>
<p>[cpp]<br />
template &lt;typename T&gt;<br />
class Rational;</p>
<p>template &lt;typename T&gt;<br />
Rational&lt;T&gt; doMultiply(const Rational&lt;T&gt; &amp;l, const Rational&lt;T&gt; &amp;r);</p>
<p>template &lt;typename T&gt;<br />
class Rational {<br />
public:<br />
...<br />
// friend, um gemischte Operatoren zu benutzen<br />
// wäre operator*() nicht in Rational definiert, würde beim Aufruf von<br />
// Rational&lt;int&gt; o = otherRational * 3<br />
// ein Compiler-Fehler kommen: 3 soll ein Rational&lt;int&gt; werden, de facto<br />
// kennt der Compiler int nicht, sondern nur T. Beim Einsatz einer Klasse ist<br />
// ihm bei der Deklaration des Operators sehr wohl T, also int, bekannt,<br />
// da T als int ja bei der Instanziierung der Klasse übergeben wird<br />
// implizit inline, da in Klasse definiert, ruft Helper wegen Blähcode auf<br />
friend const Rational operator *(const Rational &amp;l, const Rational &amp;r) {<br />
return doMultiply(l, r);<br />
}<br />
...<br />
};</p>
<p>// Helper, genaue Implementierung redundant<br />
Rational&lt;T&gt; doMultiply(const Rational&lt;T&gt; &amp;l, const Rational&lt;T&gt; &amp;r) {<br />
return Rational&lt;T&gt;(l.numerator() * r.numerator(), l.denominator() * r.demoniator());<br />
}<br />
[/cpp]</p>
<p>Friend bröckelt etwas an der Kapselung. Und nichts gegen Helper, aber die Klasse ist damit dann auch nicht mehr ganz unabhängig von dieser und später anderen Hilfsfunktionen. Für Polymorphismus gilt in dem Fall das selbe: man braucht friend-Funktionen, wenn wir Parameter implizit bei Funktionsübergabe in ein Objekt des Typs eines Klassentemplate konvertieren wollen. Oder wir nehmen kein friend, erstellen aber getter, die machen die Kapselung aber genauso etwas schwammiger. Nicht so dolle für strenge OOPler.</p>
<p>2. <strong>Statische Polymorphie benötigt man nur in der Bibliotheksentwicklung</strong></p>
<p>Da in modernen Programmen ja so gut wie alles vom Input abhängt, ist an Kompilierzeit-Polymorphismus ja gar nicht zu denken. Entwickelt man hingegen eine Bibliothek, ist der Kunde ja nicht der Benutzer, sondern der Programmierer, der seinen statischen Code niederschreibt und kompiliert. Er wird dynamische Polymorphie verwenden, weil sein Kunde der User ist, aber unsere statische Bibliothek wird immer statisch bleiben und holt damit Performance raus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1776869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1776869</guid><dc:creator><![CDATA[Troll-Flamer]]></dc:creator><pubDate>Sat, 12 Sep 2009 09:10:29 GMT</pubDate></item><item><title><![CDATA[Reply to Statische und Dynamische Polymorphie: Weiter geht&#x27;s on Sat, 12 Sep 2009 13:27:23 GMT]]></title><description><![CDATA[<p>Der Name statische Polymorphie ist ungefähr so sinnvoll wie Dauer-Tiefpreis Spezial.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777023</guid><dc:creator><![CDATA[sprüche]]></dc:creator><pubDate>Sat, 12 Sep 2009 13:27:23 GMT</pubDate></item><item><title><![CDATA[Reply to Statische und Dynamische Polymorphie: Weiter geht&#x27;s on Sat, 12 Sep 2009 14:36:38 GMT]]></title><description><![CDATA[<blockquote>
<p>DP verändert das OOP-Prinzip von C++</p>
</blockquote>
<p>Not every problem is an object. Und richtig eingesaetzt, wird nichts veraendert oder geschwaecht. Auch dein Beispiel ist schlecht gewaehlt. Aktuell wird es so in Haskell gemacht mit type classes.</p>
<p>Interfacedefinition (type class):</p>
<pre><code>class  Eq a  where
  (==), (/=)            :: a -&gt; a -&gt; Bool
  x /= y                =  not (x == y)
</code></pre>
<p>Spezialisierung, konkrete Implementation:</p>
<pre><code>instance (Eq a) =&gt; Eq (Tree a) where 
  Leaf a         == Leaf b          =  a == b
  (Branch l1 r1) == (Branch l2 r2)  =  (l1==l2) &amp;&amp; (r1==r2)
  _              == _               =  False
</code></pre>
<p>Beispiel entnommen aus <a href="http://www.haskell.org/tutorial/classes.html" rel="nofollow">A Gentle Introduction to Haskell</a> Kapitel 5, um Baume zu vergleichen. Kurze Erklaerung: um zwei Baeume vergleichen zu koennen, fordere ich nur, dass die Elemente in den Blattknoten vergleichbar sind und definiere dementsprechend meine Gleichheit fuer Baeume (rekursiv).</p>
<blockquote>
<p>Friend bröckelt etwas an der Kapselung.</p>
</blockquote>
<p><a href="http://www.parashift.com/c++-faq-lite/friends.html#faq-14.2" rel="nofollow">Do friends violate encapsulation?</a></p>
<p>PS: Ich musste auch erst ueberlegen, was mit statischer Polymorphie gemeint ist. Wie kann etwas &quot;Vielgestaltigkeit&quot; sein, wenn es doch statisch ist? <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777045</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Sat, 12 Sep 2009 14:36:38 GMT</pubDate></item></channel></rss>