<?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[Mein polymorphic_ptr]]></title><description><![CDATA[<p>Moin,</p>
<p>ich programmiere derweil einen Smart Pointer der ein Reference Counting führt und (wie der Name schon erwähnt) polymorph ist. Damit der Pointer polymorph-artig wirkt, baue ich den impliziten Typ-Konvertierungs-Operator wie folgt ein:</p>
<pre><code class="language-cpp">template&lt;typename Base&gt;
    operator Base(){
...
        return Base(dynamic_cast&lt;typename Base::pointer_type&gt;(pointer));
    }
</code></pre>
<p>Soweit funktioniert das auch sahnig, jedoch möchte ich es noch besser machen. Und zwar darf der Typ-Konvertierungs-Operator nur dann aufgerufen werden, wenn es sich auch wirklich um die Basisklasse handelt. Um dies zu realiseren, benutze ich <code>&lt;type_traits&gt;</code> ( <code>std::enable_if</code> und <code>std::is_base_of</code> ). Und genau da liegt mein Problem. Für mich sollte folgendes funktionieren:</p>
<pre><code class="language-cpp">template&lt;typename Type&gt;
class polymorphic_ptr{
...

public:
    typedef Type* pointer_type;
    typedef Type value_type;

...

    template&lt;typename Base&gt;
    operator typename std::enable_if&lt;std::is_base_of&lt;typename Base::value_type, value_type&gt;::value, Base&gt;::type(){
...
        return Base(dynamic_cast&lt;typename Base::pointer_type&gt;(pointer));
    }
...
};
</code></pre>
<p>Wenn ich jedoch folgendes teste:</p>
<pre><code class="language-cpp">#include &quot;polymorphic_ptr.hpp&quot;

class Base{};
class Derived : public Base{};

void foo(polymorphic_ptr&lt;Base&gt; ptr){}

int main(){
    polymorphic_ptr&lt;Derived&gt; ptr(new Derived);
    foo(ptr);
    return 0;
}
</code></pre>
<p>bekomme ich folgende Fehlermeldung:</p>
<pre><code>error: could not convert ‘ptr’ from ‘polymorphic_ptr&lt;Derived&gt;’ to ‘polymorphic_ptr&lt;Base&gt;’
</code></pre>
<p>Und ich weiß, dass irgendwas an dem <code>std::enable_if</code> falsch ist, aber ich sehe zum Kreischen nicht was falsch sein sollte. IMHO sollte dies doch funktionieren - erster Template-Parameter von std::is_base_of soll die Basisklasse sein, und der zweite, die vererbte Klasse. Kann mir jemand in puren Worten verraten, was ich falsch gemacht habe? Würd ich sehr schätzen.</p>
<p>Grüße.</p>
<p>P.s.: Ich weiß, ich weiß, ich könnte auch gleich <code>std::shared_ptr</code> benutzen, aber wo bleibt da denn die Übung? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/316166/mein-polymorphic_ptr</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 08:23:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316166.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Apr 2013 18:38:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mein polymorphic_ptr on Tue, 23 Apr 2013 18:38:48 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>ich programmiere derweil einen Smart Pointer der ein Reference Counting führt und (wie der Name schon erwähnt) polymorph ist. Damit der Pointer polymorph-artig wirkt, baue ich den impliziten Typ-Konvertierungs-Operator wie folgt ein:</p>
<pre><code class="language-cpp">template&lt;typename Base&gt;
    operator Base(){
...
        return Base(dynamic_cast&lt;typename Base::pointer_type&gt;(pointer));
    }
</code></pre>
<p>Soweit funktioniert das auch sahnig, jedoch möchte ich es noch besser machen. Und zwar darf der Typ-Konvertierungs-Operator nur dann aufgerufen werden, wenn es sich auch wirklich um die Basisklasse handelt. Um dies zu realiseren, benutze ich <code>&lt;type_traits&gt;</code> ( <code>std::enable_if</code> und <code>std::is_base_of</code> ). Und genau da liegt mein Problem. Für mich sollte folgendes funktionieren:</p>
<pre><code class="language-cpp">template&lt;typename Type&gt;
class polymorphic_ptr{
...

public:
    typedef Type* pointer_type;
    typedef Type value_type;

...

    template&lt;typename Base&gt;
    operator typename std::enable_if&lt;std::is_base_of&lt;typename Base::value_type, value_type&gt;::value, Base&gt;::type(){
...
        return Base(dynamic_cast&lt;typename Base::pointer_type&gt;(pointer));
    }
...
};
</code></pre>
<p>Wenn ich jedoch folgendes teste:</p>
<pre><code class="language-cpp">#include &quot;polymorphic_ptr.hpp&quot;

class Base{};
class Derived : public Base{};

void foo(polymorphic_ptr&lt;Base&gt; ptr){}

int main(){
    polymorphic_ptr&lt;Derived&gt; ptr(new Derived);
    foo(ptr);
    return 0;
}
</code></pre>
<p>bekomme ich folgende Fehlermeldung:</p>
<pre><code>error: could not convert ‘ptr’ from ‘polymorphic_ptr&lt;Derived&gt;’ to ‘polymorphic_ptr&lt;Base&gt;’
</code></pre>
<p>Und ich weiß, dass irgendwas an dem <code>std::enable_if</code> falsch ist, aber ich sehe zum Kreischen nicht was falsch sein sollte. IMHO sollte dies doch funktionieren - erster Template-Parameter von std::is_base_of soll die Basisklasse sein, und der zweite, die vererbte Klasse. Kann mir jemand in puren Worten verraten, was ich falsch gemacht habe? Würd ich sehr schätzen.</p>
<p>Grüße.</p>
<p>P.s.: Ich weiß, ich weiß, ich könnte auch gleich <code>std::shared_ptr</code> benutzen, aber wo bleibt da denn die Übung? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2317869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2317869</guid><dc:creator><![CDATA[sabber]]></dc:creator><pubDate>Tue, 23 Apr 2013 18:38:48 GMT</pubDate></item><item><title><![CDATA[Reply to Mein polymorphic_ptr on Tue, 23 Apr 2013 18:43:06 GMT]]></title><description><![CDATA[<p>Nimm lieber einen Konvertierungskonstruktor als einen -operator.</p>
<p>Und versuchs erst mal ohne SFINAE.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2317871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2317871</guid><dc:creator><![CDATA[ribidibim]]></dc:creator><pubDate>Tue, 23 Apr 2013 18:43:06 GMT</pubDate></item><item><title><![CDATA[Reply to Mein polymorphic_ptr on Tue, 23 Apr 2013 18:45:18 GMT]]></title><description><![CDATA[<p>ribidibim schrieb:</p>
<blockquote>
<p>Nimm lieber einen Konvertierungskonstruktor als einen -operator.</p>
<p>Und versuchs erst mal ohne SFINAE.</p>
</blockquote>
<p>Ich würds dennoch sehr schätzen wenn mir jemand sagen würde was ich denn falsch gemacht habe. Worte genügen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2317872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2317872</guid><dc:creator><![CDATA[sabber]]></dc:creator><pubDate>Tue, 23 Apr 2013 18:45:18 GMT</pubDate></item><item><title><![CDATA[Reply to Mein polymorphic_ptr on Tue, 23 Apr 2013 18:48:13 GMT]]></title><description><![CDATA[<p>a)</p>
<pre><code class="language-cpp">template&lt;typename Base,
         typename = typename std::enable_if&lt;std::is_base_of&lt;typename Base::value_type, value_type&gt;::value&gt;::type&gt;
operator Base(){
  return Base(dynamic_cast&lt;typename Base::pointer_type&gt;(pointer));
}
</code></pre>
<p>b)</p>
<pre><code class="language-cpp">static_assert(std::is_base_of&lt;typename Base::value_type, value_type&gt;::value, &quot;Hey, this is not the base&quot;);
</code></pre>
<p>c) NEIN! Mach das nicht! Einen dynamic_cast sollte man immer argwöhnisch betrachten. Der ist selten gut, oft unnötig. Ihn in einem impliziten Cast zu verstecken ist so mit das schlimmste, was man machen kann. Explizit vielleicht, da kann man sich streiten, aber implizit nie.</p>
<p>d) Wofür brauchst du das, das riecht nach schlechtem Design.</p>
<pre><code class="language-cpp">static_assert(false, &quot;You are trying to hide a dynamic_cast. Your design is broken!&quot;);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2317875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2317875</guid><dc:creator><![CDATA[abcd]]></dc:creator><pubDate>Tue, 23 Apr 2013 18:48:13 GMT</pubDate></item><item><title><![CDATA[Reply to Mein polymorphic_ptr on Tue, 23 Apr 2013 19:00:17 GMT]]></title><description><![CDATA[<p>Soso.</p>
<p>Ich dachte bei sowas wie &quot;operator T()&quot; könnte man T genauso wie einen Rückgabetypen behandeln. Wohl doch nicht.</p>
<p>Nun, das dynamic_cast hab ich dann mal entfernt (werde gleich mal seine Nachteile ergoogeln).</p>
<p>abcd schrieb:</p>
<blockquote>
<p>d) Wofür brauchst du das, das riecht nach schlechtem Design.</p>
</blockquote>
<p>Ist das nun auf das dynamic_cast, oder auf meine gesamte Klasse bezogen?<br />
Also ich finde einen polymorph-artigen Pointer schon nützlich und sähe es eher als Nachteil, wenn man einen Smart Pointer vom Typ Derived nicht in einen Smart Pointer vom Typ Base konvertieren könnte.</p>
<p>Ansonsten vielen Dank für die Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2317878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2317878</guid><dc:creator><![CDATA[sabber]]></dc:creator><pubDate>Tue, 23 Apr 2013 19:00:17 GMT</pubDate></item><item><title><![CDATA[Reply to Mein polymorphic_ptr on Tue, 23 Apr 2013 20:57:05 GMT]]></title><description><![CDATA[<p>Was kann dein Smart-Pointer, das <code>std::unique_ptr</code> nicht kann?</p>
<p>Oder was genau verstehst du unter &quot;polymorph&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2317918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2317918</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 23 Apr 2013 20:57:05 GMT</pubDate></item><item><title><![CDATA[Reply to Mein polymorphic_ptr on Wed, 24 Apr 2013 09:37:14 GMT]]></title><description><![CDATA[<p>Naja, er hat &quot;Referenzzähler&quot; erwähnt. Also wird das Ding wohl im Gegensatz zu unique_ptr kopierbar sein. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Aber im Ernst: Was sabber mit &quot;polymorph&quot; in diesem Kontext meint, verstehe ich auch nicht. Der Rest klingt nur nach Konvertierungsmöglichkeiten.</p>
<p>shared_ptr ist <em>ungefähr</em> so gestrickt:</p>
<pre><code class="language-cpp">namespace shared_ptr_details { // Internas

struct control_base
{
  std::atomic&lt;unsigned long&gt; refcounter;

  // hier fehlt noch die Unterstuetzung von weak_ptr

  virtual ~control_base() {}
};

} // namespace shared_ptr_details

template&lt;class T&gt;
class shared_ptr
{
public:
  shared_ptr()
    : ptr(nullptr), control(nullptr)
  {}

  template&lt;class U&gt;
  explicit shared_ptr(U* p,
    typename std::enable_if&lt;
      std::is_convertible&lt;U*,T*&gt;::value
    &gt;::type* =0);

  template&lt;class U&gt;
  shared_ptr(shared_ptr&lt;U&gt; const&amp; sp,
    typename std::enable_if&lt;
      std::is_convertible&lt;U*,T*&gt;::value
    &gt;::type* =0)
  : ptr(sp.ptr), control(sp.control)
  { if (control) ++(control-&gt;refcounter); }

  ...

  T* operator-&gt;() const {return ptr;}
  T&amp; operator*() const {return *ptr;}

  explicit operator bool() const {return ptr;}
  bool operator!() const {return !ptr;}

  ~shared_ptr()
  {
    if (control &amp;&amp; (control-&gt;refcounter-- == 0))
      delete control;
  }

private:
  T* ptr;
  shared_ptr_details::control_base* control;

  template&lt;class&gt; friend class shared_ptr;
};
</code></pre>
<p>und erlaubt damit beispielsweise implizite shared_ptr&lt;Derived&gt; zu shared_ptr&lt;Base&gt; Konvertierungen, genauso wie shared_ptr&lt;int&gt; zu shared_ptr&lt;const int&gt;. <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>
<p>Fehler dürfen vom Fragesteller korrigiert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2317999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2317999</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 24 Apr 2013 09:37:14 GMT</pubDate></item><item><title><![CDATA[Reply to Mein polymorphic_ptr on Wed, 24 Apr 2013 10:03:09 GMT]]></title><description><![CDATA[<p>*kopfkratz*</p>
<p>Ich dachte immer Polymorphie bedeutet, dass eine Variable unterschiedliche Datentypen annehmen kann. Wohl doch nicht?</p>
<p>Meine Englischkenntnisse sind nicht gerade hervorragend, d.h. ich könnte vieles in den englischen Lektüren die ich gelesen habe ganz einfach falsch interpretiert haben.</p>
<p>Grüße.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2318005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318005</guid><dc:creator><![CDATA[sabber]]></dc:creator><pubDate>Wed, 24 Apr 2013 10:03:09 GMT</pubDate></item><item><title><![CDATA[Reply to Mein polymorphic_ptr on Wed, 24 Apr 2013 10:24:25 GMT]]></title><description><![CDATA[<p>sabber schrieb:</p>
<blockquote>
<p>Ich dachte immer Polymorphie bedeutet, dass eine Variable unterschiedliche Datentypen annehmen kann. Wohl doch nicht?</p>
</blockquote>
<p>Das würde ich eher &quot;dynamic typing&quot; nennen. Aber das meinst Du wahrscheinlich auch nicht.</p>
<p>Wie auch immer: Du machst das nur als Übrung, oder? Denn sonst wüsste ich auch gerne, wie sich das, was du bauen willst, von std::shared_ptr unterscheiden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2318012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318012</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 24 Apr 2013 10:24:25 GMT</pubDate></item><item><title><![CDATA[Reply to Mein polymorphic_ptr on Wed, 24 Apr 2013 10:47:28 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Wie auch immer: Du machst das nur als Übrung, oder? Denn sonst wüsste ich auch gerne, wie sich das, was du bauen willst, von std::shared_ptr unterscheiden soll.</p>
</blockquote>
<p>Jo.<br />
Nun, der Unterschied ist halt, dass man bei meinem Smart Pointer halt nur Konvertierungen zwischen vererbten und Basisklassen zugelassen werden, wobei man z.B. beim <code>std::shared_ptr</code> (wie Du auch schon gesagt hast) <code>int</code> zu <code>const int</code> konvertieren kann.<br />
Mir ist halt im Moment etwas langweilig <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Das würde ich eher &quot;dynamic typing&quot; nennen. Aber das meinst Du wahrscheinlich auch nicht.</p>
</blockquote>
<p>Nun, doch, genau das mein ich.<br />
Unter Wikipedia lese ich z.B. folgendes:</p>
<p>Wikipedia (&lt;a href= schrieb:</p>
<blockquote>
<p>Quelle)&quot;&gt;Polymorphie oder Polymorphismus (griechisch, „Vielgestaltigkeit“) ist ein Konzept in Programmiersprachen, das die Fähigkeit eines Bezeichners beschreibt, abhängig von seiner Verwendung <strong>unterschiedliche Datentypen anzunehmen.</strong></p>
</blockquote>
<p>Andere Quellen gehen auch auf ungf. das Gleiche hinaus, wie das, was auch Wikipedia steht.<br />
krümelkacker: Könntest Du mir dann vielleicht noch verraten, was Du unter Polymorphie verstehst? Das würd mich dann mal brennend interessieren! <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>
<p>Grüßle</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2318017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318017</guid><dc:creator><![CDATA[sabber]]></dc:creator><pubDate>Wed, 24 Apr 2013 10:47:28 GMT</pubDate></item><item><title><![CDATA[Reply to Mein polymorphic_ptr on Wed, 24 Apr 2013 11:22:19 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>sabber schrieb:</p>
<blockquote>
<p>Unter Wikipedia lese ich z.B. folgendes:</p>
<p>Wikipedia (&lt;a href= schrieb:</p>
<blockquote>
<p>Quelle)&quot;&gt;Polymorphie oder Polymorphismus (griechisch, „Vielgestaltigkeit“) ist ein Konzept in Programmiersprachen, das die Fähigkeit eines Bezeichners beschreibt, abhängig von seiner Verwendung <strong>unterschiedliche Datentypen anzunehmen.</strong></p>
</blockquote>
<p>Andere Quellen gehen auch auf ungf. das Gleiche hinaus, wie das, was auch Wikipedia steht.</p>
</blockquote>
<p>Sehr schwach.</p>
</blockquote>
<p>Wechle mal nach Englisch. &quot;In computer science, polymorphism is a programming language feature that allows values of different data types to be handled using a uniform interface. &quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2318031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318031</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 24 Apr 2013 11:22:19 GMT</pubDate></item><item><title><![CDATA[Reply to Mein polymorphic_ptr on Wed, 24 Apr 2013 11:30:17 GMT]]></title><description><![CDATA[<p>Wenn ich das also richtig verstanden habe, ist das Wort &quot;Polymorphie&quot; also eher den virtuellen Methoden gewidmet(?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2318032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318032</guid><dc:creator><![CDATA[sabber]]></dc:creator><pubDate>Wed, 24 Apr 2013 11:30:17 GMT</pubDate></item><item><title><![CDATA[Reply to Mein polymorphic_ptr on Wed, 24 Apr 2013 11:52:13 GMT]]></title><description><![CDATA[<p>sabber schrieb:</p>
<blockquote>
<p>Wenn ich das also richtig verstanden habe, ist das Wort &quot;Polymorphie&quot; also eher den virtuellen Methoden gewidmet(?)</p>
</blockquote>
<p>Je nach Quelle.<br />
Die älteren, schlechteren oder von C++ weiter entfernten Quellen meinen damit oft ausschließlich diese Art der Polymorphie der virtuellen Methoden.</p>
<p>Der deute Wikipediaeintrag gibt sich gerade Mühe, ein wenig weiter zu sehen, wird aber mit &quot;Polymorphie in der Softwareentwicklung&quot; schon von Schwätzern vergiftet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2318040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318040</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 24 Apr 2013 11:52:13 GMT</pubDate></item><item><title><![CDATA[Reply to Mein polymorphic_ptr on Wed, 24 Apr 2013 11:55:21 GMT]]></title><description><![CDATA[<p>sabber schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Wie auch immer: Du machst das nur als Übrung, oder? Denn sonst wüsste ich auch gerne, wie sich das, was du bauen willst, von std::shared_ptr unterscheiden soll.</p>
</blockquote>
<p>Jo.<br />
Nun, der Unterschied ist halt, dass man bei meinem Smart Pointer halt nur Konvertierungen zwischen vererbten und Basisklassen zugelassen werden, wobei man z.B. beim <code>std::shared_ptr</code> (wie Du auch schon gesagt hast) <code>int</code> zu <code>const int</code> konvertieren kann.</p>
</blockquote>
<p>Wieso diese künstliche Einschränkung? Du kannst doch beides auf einen Schlag abdecken mit dem templatisierten Konvertierungskonstruktor.</p>
<p>sabber schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Das würde ich eher &quot;dynamic typing&quot; nennen. Aber das meinst Du wahrscheinlich auch nicht.</p>
</blockquote>
<p>Nun, doch, genau das mein ich.<br />
Unter Wikipedia lese ich z.B. folgendes:<br />
[...]</p>
</blockquote>
<p>Wenn du sagst, dass der Typ einer Variablen sich ändern kann, dann hat das nichts mit C++ zu tun, weil in C++ der Typ einer Variablen immer derselbe ist. Erst wenn du eine Indirektionsstufe (Zeiger o. ä.) hinzufügst und die Basisklasse &quot;polymorph&quot; machst, indem du ihr einen virtuellen Destruktor oder mindestens eine virtuelle Funktion spendierst, kann es Polymorphie im OOP-Sinne geben.</p>
<pre><code class="language-cpp">Base* p = ...;
</code></pre>
<p>Der statische Typ von p ist Base* und immer derselbe. Der statische Typ von *p, also p dereferenziert, ist Base und auch immer derselbe. <em>Aber</em>, der <em>dynamische Typ</em> von *p kann etwas anderes als Base sein, wobei der dynamische Typ von *p aber dann wenigstens von Base abgeleitet ist. Du kannst p jetzt zwar auf ein anderes Objekt mit einem anderen dynamischen Typen zeigen lassen, aber p ist immer noch ein Base-Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2318042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318042</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 24 Apr 2013 11:55:21 GMT</pubDate></item><item><title><![CDATA[Reply to Mein polymorphic_ptr on Wed, 24 Apr 2013 12:20:15 GMT]]></title><description><![CDATA[<p>Nadann!</p>
<p>Danke nochmals für die Aufklärungen.</p>
<p>Ich werde meinen polymorphic_ptr dann halt in my_shared_ptr umtaufen und die künstliche Beschränkung dann halt verwerfen.</p>
<p>Desweiteren glaube ich jetzt das Wort &quot;Polymorphie&quot; (zumindest) besser verstanden zu haben als vorhin und da ich diesen Satz hier jetzt nicht gleich mit einem Punkt beenden will, sage ich nochmals Danke! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Grüße.</p>
<p>*eine Packung Merci-Schokolade in den Thread stell*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2318046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318046</guid><dc:creator><![CDATA[sabber]]></dc:creator><pubDate>Wed, 24 Apr 2013 12:20:15 GMT</pubDate></item></channel></rss>