<?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[Kompilerbug?]]></title><description><![CDATA[<pre><code class="language-cpp">class B
{
public:
	B* getB(){return b;}
protected:
	int i;
private:
	B* b;

};

class C : public B
{
public:
	void foo(C* c)
	{
		B* b = c-&gt;getB();
		i++; //geht natürlich
		c-&gt;i++; //geht auch
		b-&gt;i++; // geht nicht! Warum?
		static_cast&lt;C*&gt;(b)-&gt;i++; //geht wieder
	}
};
</code></pre>
<blockquote>
<p>error C2248: &quot;B::i&quot;: Kein Zugriff auf protected Member, dessen Deklaration in der B-Klasse erfolgte.</p>
</blockquote>
<p>Warum habe ich kein Zugriff auf i von B, wenn ich ein B bin?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274513/kompilerbug</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 10:27:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274513.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Sep 2010 18:29:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kompilerbug? on Mon, 27 Sep 2010 18:29:53 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class B
{
public:
	B* getB(){return b;}
protected:
	int i;
private:
	B* b;

};

class C : public B
{
public:
	void foo(C* c)
	{
		B* b = c-&gt;getB();
		i++; //geht natürlich
		c-&gt;i++; //geht auch
		b-&gt;i++; // geht nicht! Warum?
		static_cast&lt;C*&gt;(b)-&gt;i++; //geht wieder
	}
};
</code></pre>
<blockquote>
<p>error C2248: &quot;B::i&quot;: Kein Zugriff auf protected Member, dessen Deklaration in der B-Klasse erfolgte.</p>
</blockquote>
<p>Warum habe ich kein Zugriff auf i von B, wenn ich ein B bin?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958201</guid><dc:creator><![CDATA[äää?]]></dc:creator><pubDate>Mon, 27 Sep 2010 18:29:53 GMT</pubDate></item><item><title><![CDATA[Reply to Kompilerbug? on Mon, 27 Sep 2010 18:37:30 GMT]]></title><description><![CDATA[<p>Das ist schon richtig so, bei protected darfst du zwar auf die eigenen geerbten Elemente zugreifen, aber nicht auf die von anderen Instanzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958206</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Mon, 27 Sep 2010 18:37:30 GMT</pubDate></item><item><title><![CDATA[Reply to Kompilerbug? on Mon, 27 Sep 2010 18:50:17 GMT]]></title><description><![CDATA[<p>Von einem Compilerbug sollte man immer zuletzt ausgehen. Vor allem, wenn man sich bei einem Sprachmittel nicht sicher ist... <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/1958217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958217</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 27 Sep 2010 18:50:17 GMT</pubDate></item><item><title><![CDATA[Reply to Kompilerbug? on Mon, 27 Sep 2010 19:07:24 GMT]]></title><description><![CDATA[<p>Athar schrieb:</p>
<blockquote>
<p>Das ist schon richtig so, bei protected darfst du zwar auf die eigenen geerbten Elemente zugreifen, aber nicht auf die von anderen Instanzen.</p>
</blockquote>
<p>Ich darf doch auf c-&gt;i++; zugreifen.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Von einem Compilerbug sollte man immer zuletzt ausgehen. Vor allem, wenn man sich bei einem Sprachmittel nicht sicher ist... <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>
</blockquote>
<p>Na gut, dann Sprachbug. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1958225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958225</guid><dc:creator><![CDATA[äää?]]></dc:creator><pubDate>Mon, 27 Sep 2010 19:07:24 GMT</pubDate></item><item><title><![CDATA[Reply to Kompilerbug? on Mon, 27 Sep 2010 19:13:00 GMT]]></title><description><![CDATA[<p>äää? schrieb:</p>
<blockquote>
<p>Athar schrieb:</p>
<blockquote>
<p>Das ist schon richtig so, bei protected darfst du zwar auf die eigenen geerbten Elemente zugreifen, aber nicht auf die von anderen Instanzen.</p>
</blockquote>
<p>Ich darf doch auf c-&gt;i++; zugreifen.</p>
</blockquote>
<p>Ja, aber c ist eben ein Pointer auf eine Instanz der Klasse C - also greifst du auf das geerbte Member i zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958227</guid><dc:creator><![CDATA[inter2k3]]></dc:creator><pubDate>Mon, 27 Sep 2010 19:13:00 GMT</pubDate></item><item><title><![CDATA[Reply to Kompilerbug? on Mon, 27 Sep 2010 19:16:13 GMT]]></title><description><![CDATA[<p>Objekte einer Klasse dürfen auf protected/private - Member anderer Objekte derselben Klasse zugreifen. Deshalb geht c-&gt;i++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958230</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 27 Sep 2010 19:16:13 GMT</pubDate></item><item><title><![CDATA[Reply to Kompilerbug? on Mon, 27 Sep 2010 19:20:17 GMT]]></title><description><![CDATA[<p>Hat das irgendeinen Grund, warum C nicht auf i von anderen B zureifen kann, wenn C eigentlich auch ein B ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958232</guid><dc:creator><![CDATA[äää?]]></dc:creator><pubDate>Mon, 27 Sep 2010 19:20:17 GMT</pubDate></item><item><title><![CDATA[Reply to Kompilerbug? on Tue, 28 Sep 2010 00:19:45 GMT]]></title><description><![CDATA[<p>äää? schrieb:</p>
<blockquote>
<p>Hat das irgendeinen Grund, warum C nicht auf i von anderen B zureifen kann, wenn C eigentlich auch ein B ist?</p>
</blockquote>
<p>Ja, natürlich hat es einen Grund.</p>
<p>Wäre es anders, könntest du <code>protected</code> ganz einfach aushebeln, und (über eine Hilfsklasse) beliebig von aussen darauf zugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958304</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 28 Sep 2010 00:19:45 GMT</pubDate></item><item><title><![CDATA[Reply to Kompilerbug? on Tue, 28 Sep 2010 14:46:57 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>äää? schrieb:</p>
<blockquote>
<p>Hat das irgendeinen Grund, warum C nicht auf i von anderen B zureifen kann, wenn C eigentlich auch ein B ist?</p>
</blockquote>
<p>Ja, natürlich hat es einen Grund.</p>
<p>Wäre es anders, könntest du <code>protected</code> ganz einfach aushebeln, und (über eine Hilfsklasse) beliebig von aussen darauf zugreifen.</p>
</blockquote>
<p>Kann man das nicht so schreiben:</p>
<pre><code class="language-cpp">((C*)b)-&gt;i++;
</code></pre>
<p>?<br />
Oder ist das undefiniert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958580</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Tue, 28 Sep 2010 14:46:57 GMT</pubDate></item><item><title><![CDATA[Reply to Kompilerbug? on Tue, 28 Sep 2010 18:28:10 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>äää? schrieb:</p>
<blockquote>
<p>Hat das irgendeinen Grund, warum C nicht auf i von anderen B zureifen kann, wenn C eigentlich auch ein B ist?</p>
</blockquote>
<p>Ja, natürlich hat es einen Grund.</p>
<p>Wäre es anders, könntest du <code>protected</code> ganz einfach aushebeln, und (über eine Hilfsklasse) beliebig von aussen darauf zugreifen.</p>
</blockquote>
<p>Kann man das nicht so schreiben:</p>
<pre><code class="language-cpp">((C*)b)-&gt;i++;
</code></pre>
<p>?<br />
Oder ist das undefiniert?</p>
</blockquote>
<p>Ich würde sagen das ist undefiniert, da du nen Zeiger auf ein Objekt erzeugst und noch dazu dereferenzierst welches (so) nicht existiert.<br />
(Es sei denn natürlich dass &quot;b&quot; auf ein echtes &quot;C&quot; zeigen würde, aber dann ist ja sowieso klar dass es OK und &quot;erlaubt&quot; ist.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958678</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 28 Sep 2010 18:28:10 GMT</pubDate></item><item><title><![CDATA[Reply to Kompilerbug? on Wed, 29 Sep 2010 09:47:28 GMT]]></title><description><![CDATA[<p>Also Up und Downcasts sind doch eine ganz legitime Geschichte, nur eben das Downcasts potentiell gefährlich sind.<br />
Des weiteren wird eine Basisklasse ja immer zuerst erzeugt, dann der &quot;Aufsatz&quot;.<br />
Bei einem Downcast zu einer Ableitung, wo nur eine Basis liegt, kann man den reinen Basisteil auch ganz normal verwenden.</p>
<p>@äää<br />
Auch wenn so eine Ableitung eine ist-ein Beziehung abbilden soll, ist dem bei einer differenzierteren Betrachtung einfach nicht so. Du musst Konstrukt und Verwendungsmöglichkeiten auseinander halten. Tasächlich könnte man das ganze (auf den Ersten Blick) wie eine Klasse Vorstellen, welche Ihre Basis als Element enthält. Mal abgesehen von dem Protectedmechanismus hat die Subklasse ja den gleichen Zugrif auf seine Basis wie irgendeine andere klasse auf ein Objekt der Basis. Wenn du mal Ausgaben in Konstruktoren und Destruktoren einfügst, wirst du feststellen das bei einer Klassenheirarchie jedes Objekt für sich erstellt wird. Die Instanziierung der Klasse C aus deinem Beispiel hat demanch 2 Konstruktoraufrufe und 2 Destruktoraufrufe zur Folge.<br />
Aber wie gesagt, ist nur auf dem Ersten Blick so als hätte man die Basis als Element.</p>
<p>Wäre ein C ein B könnte C bei (beinhaltenden) Bs auch auf private Elemente zugreifen, wie es Die Bs bei beinhaltenden anderen B-Objekten auch können.</p>
<p>Verstehe mich nicht falsch, das fegt die Ist-Ein Beziehung nicht vom Tisch.<br />
Aber diese entsteht lediglich durch die Verwendungsmöglichkeiten für dieses Konstrukt wie Polymorphie usw.</p>
<p>Diese &quot;Ist-Ein Beziehung&quot; kommt halt dadurch zustande, dass man solche Konstrukte eben polymorph zum Beispiel. Dazu gibt es dann auf der Konstruktionsseite dan auch einige Hilfen wie virtuelle Methoden und Abstraktheit usw.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958876</guid><dc:creator><![CDATA[Ka-Mensch]]></dc:creator><pubDate>Wed, 29 Sep 2010 09:47:28 GMT</pubDate></item></channel></rss>