<?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[&#96;static_cast&#96; von virtueller Basisklasse]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich dachte bisher immer, folgender Code sei gültiges C++.</p>
<pre><code class="language-cpp">struct B { virtual ~B() {} };

struct D : B { };

int main() {
    B const&amp; b = D();
    D const&amp; d = static_cast&lt;D const&amp;&gt;(b);
}
</code></pre>
<p>Es kompiliert auf jeden Fall problemlos und scheint auch zu funktionieren. Aber jetzt hat mich <a href="http://stackoverflow.com/questions/280531/c-pitfalls" rel="nofollow">jemand</a> auf [5.2.9.8] hingewiesen:</p>
<p>C++-Standard schrieb:</p>
<blockquote>
<p>An rvalue of type “pointer to <em>cv1</em> <code>B</code> ”, where <code>B</code> is a class type, can be converted to an rvalue of type “pointer to <em>cv2</em> <code>D</code> ”, where <code>D</code> is a class derived (clause 10) from <code>B</code> , if a valid standard conversion from “pointer to <code>D</code> ” to “pointer to <code>B</code> ” exists (4.10), <em>cv2</em> is the same cv-qualification as, or greater cv-qualification than, <em>cv1</em>, **and <code>B</code> is not a virtual base class of <code>D</code> **.</p>
</blockquote>
<p>(Hervorhebung von mir.)</p>
<p>Mein Weltbild stürzt ein. Oder was übersehe ich da?</p>
<p><strong>/EDIT:</strong> Terminologiefrage. Ist obiges vielleicht gar keine virtuelle Basisklasse sondern lediglich eine Basisklasse mit vtable? Ich finde gerade die Begriffsdefinition im Standard nicht, aber folgendes, in 10.3.1.:</p>
<blockquote>
<p>A class that declares or inherits a virtual function is called a <em>polymorphic class</em></p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/topic/227237/static_cast-von-virtueller-basisklasse</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 04:02:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227237.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 12 Nov 2008 19:32:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &#96;static_cast&#96; von virtueller Basisklasse on Wed, 12 Nov 2008 19:35:00 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich dachte bisher immer, folgender Code sei gültiges C++.</p>
<pre><code class="language-cpp">struct B { virtual ~B() {} };

struct D : B { };

int main() {
    B const&amp; b = D();
    D const&amp; d = static_cast&lt;D const&amp;&gt;(b);
}
</code></pre>
<p>Es kompiliert auf jeden Fall problemlos und scheint auch zu funktionieren. Aber jetzt hat mich <a href="http://stackoverflow.com/questions/280531/c-pitfalls" rel="nofollow">jemand</a> auf [5.2.9.8] hingewiesen:</p>
<p>C++-Standard schrieb:</p>
<blockquote>
<p>An rvalue of type “pointer to <em>cv1</em> <code>B</code> ”, where <code>B</code> is a class type, can be converted to an rvalue of type “pointer to <em>cv2</em> <code>D</code> ”, where <code>D</code> is a class derived (clause 10) from <code>B</code> , if a valid standard conversion from “pointer to <code>D</code> ” to “pointer to <code>B</code> ” exists (4.10), <em>cv2</em> is the same cv-qualification as, or greater cv-qualification than, <em>cv1</em>, **and <code>B</code> is not a virtual base class of <code>D</code> **.</p>
</blockquote>
<p>(Hervorhebung von mir.)</p>
<p>Mein Weltbild stürzt ein. Oder was übersehe ich da?</p>
<p><strong>/EDIT:</strong> Terminologiefrage. Ist obiges vielleicht gar keine virtuelle Basisklasse sondern lediglich eine Basisklasse mit vtable? Ich finde gerade die Begriffsdefinition im Standard nicht, aber folgendes, in 10.3.1.:</p>
<blockquote>
<p>A class that declares or inherits a virtual function is called a <em>polymorphic class</em></p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1613724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613724</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Wed, 12 Nov 2008 19:35:00 GMT</pubDate></item><item><title><![CDATA[Reply to &#96;static_cast&#96; von virtueller Basisklasse on Wed, 12 Nov 2008 20:12:49 GMT]]></title><description><![CDATA[<p>ich denke es ist ein interface gemeint, also alles pure virtual.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613736</guid><dc:creator><![CDATA[vermutung]]></dc:creator><pubDate>Wed, 12 Nov 2008 20:12:49 GMT</pubDate></item><item><title><![CDATA[Reply to &#96;static_cast&#96; von virtueller Basisklasse on Wed, 12 Nov 2008 20:23:05 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p><strong>/EDIT:</strong> Terminologiefrage. Ist obiges vielleicht gar keine virtuelle Basisklasse sondern lediglich eine Basisklasse mit vtable?</p>
</blockquote>
<p>Ja, obiges ist wie gesagt eine polymorphe Klasse (Klasse mit virtuellen Funktionen, mit VTable).</p>
<p>Mit virtueller Basisklasse bezeichnet man den Umstand, dass virtuell vererbt wird:</p>
<pre><code class="language-cpp">class A : B, virtual C
{

};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1613742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613742</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 12 Nov 2008 20:23:05 GMT</pubDate></item><item><title><![CDATA[Reply to &#96;static_cast&#96; von virtueller Basisklasse on Wed, 12 Nov 2008 20:34:01 GMT]]></title><description><![CDATA[<p>Was ist den das? Was bringt virtuelle Vererbung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613747</guid><dc:creator><![CDATA[äpfelchen]]></dc:creator><pubDate>Wed, 12 Nov 2008 20:34:01 GMT</pubDate></item><item><title><![CDATA[Reply to &#96;static_cast&#96; von virtueller Basisklasse on Wed, 12 Nov 2008 20:38:39 GMT]]></title><description><![CDATA[<p>google mal nach Mehrfachvererbung und &quot;diamond of death&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613748</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Wed, 12 Nov 2008 20:38:39 GMT</pubDate></item><item><title><![CDATA[Reply to &#96;static_cast&#96; von virtueller Basisklasse on Wed, 12 Nov 2008 20:42:36 GMT]]></title><description><![CDATA[<p>äpfelchen schrieb:</p>
<blockquote>
<p>Was ist den das? Was bringt virtuelle Vererbung?</p>
</blockquote>
<p>Virtuelle Basisklassen kommen bei Mehrfachvererbung zum Zug.</p>
<p>Hat man zum Beispiel Folgendes:</p>
<pre><code class="language-cpp">class Base {};

class Middle1 : public Base {};

class Middle2 : public Base {};

class Derived : public Middle1, public Middle2 {};
</code></pre>
<p>Hier würde <code>Base</code> zwei Mal konstruiert, da von jeder <code>Middle</code> aus der Konstruktor aufgerufen wird. Um diese Zweideutigkeit zu umgehen, kann man eine Basisklasse als <code>virtual</code> angeben. Diese ist dann &quot;schwächer&quot;, wird also vernachlässigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613751</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 12 Nov 2008 20:42:36 GMT</pubDate></item><item><title><![CDATA[Reply to &#96;static_cast&#96; von virtueller Basisklasse on Thu, 13 Nov 2008 02:41:52 GMT]]></title><description><![CDATA[<p>Ben04 schrieb:</p>
<blockquote>
<p>google mal nach Mehrfachvererbung und &quot;diamond of death&quot;.</p>
</blockquote>
<p>oder auch &quot;dreaded diamond&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613812</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 13 Nov 2008 02:41:52 GMT</pubDate></item><item><title><![CDATA[Reply to &#96;static_cast&#96; von virtueller Basisklasse on Thu, 13 Nov 2008 09:03:09 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Um diese Zweideutigkeit zu umgehen, kann man eine Basisklasse als virtual angeben. Diese ist dann &quot;schwächer&quot;, wird also vernachlässigt.</p>
</blockquote>
<p>Nein. Wenn du lediglich ein Obejkt virtual erben lässt, ändert das rein gar nichts an dem Problem der Mehrdeutigkeit (welche sich ja auch duch explizite Qualifizierer umgehen lässt).<br />
Das Problem ist eher rein logischer Natur. Warum sollte eine Klasse 2 mal vom genau gleichen Objekt erben.</p>
<p>Wenn du aber beide Objekte Mittels virtual erben lässt, wird nicht da eine vernachlässigt, sondern ganz einfach nur eines erstellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613892</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 13 Nov 2008 09:03:09 GMT</pubDate></item><item><title><![CDATA[Reply to &#96;static_cast&#96; von virtueller Basisklasse on Thu, 13 Nov 2008 18:21:32 GMT]]></title><description><![CDATA[<p>Okay, danke für die Berichtigung. Ich hatte selber noch nie mit Mehrfachvererbung zu tun, deshalb wusste ich es nur noch vage aus der Theorie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1614300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1614300</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 13 Nov 2008 18:21:32 GMT</pubDate></item></channel></rss>