<?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[Frage zu Vererbungsstruktur und proteced]]></title><description><![CDATA[<p>Folgender beispielhafter Code:</p>
<pre><code class="language-cpp">class Basis
{
protected:
    virtual void render() = 0;
};

class KindA : public Basis
{
protected:
    virtual void render() { //impl ... }

};

class KindB : public Basis
{
protected:
    virtual void render() { muchRenderObjects[i]-&gt;render(); }   //Compilefehler

private:
    std::vector&lt;Basis*&gt; muchRenderObjects;
};
</code></pre>
<p>wenn ich in KindB auf Basis-Objekte die Methode render() anwenden will, hab ich keine Rechte auf die protected-Methode zuzugreifen.<br />
Ich dachte, dass geht? In meinem C++ Kompendium habe ich dazu nichts weiter gefunden. Mal schnell in Java probiert: da geht es.</p>
<p>Nun wollt ich wissen: ist das standardkonform oder ein Compilerproblem?<br />
Und wenn es standardkonform ist, wie kann man sowas elegant lösen? Mir würde jetzt nur einfallen, dass render public zu machen.</p>
<p>MfG Pellaeon</p>
<p>PS: Das muchRenderObjects[i]-&gt;render(); ist nur vereinfacht und steht natürlich nicht alleine im Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/217130/frage-zu-vererbungsstruktur-und-proteced</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 15:53:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/217130.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 03 Jul 2008 11:45:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Vererbungsstruktur und proteced on Thu, 03 Jul 2008 11:47:31 GMT]]></title><description><![CDATA[<p>Folgender beispielhafter Code:</p>
<pre><code class="language-cpp">class Basis
{
protected:
    virtual void render() = 0;
};

class KindA : public Basis
{
protected:
    virtual void render() { //impl ... }

};

class KindB : public Basis
{
protected:
    virtual void render() { muchRenderObjects[i]-&gt;render(); }   //Compilefehler

private:
    std::vector&lt;Basis*&gt; muchRenderObjects;
};
</code></pre>
<p>wenn ich in KindB auf Basis-Objekte die Methode render() anwenden will, hab ich keine Rechte auf die protected-Methode zuzugreifen.<br />
Ich dachte, dass geht? In meinem C++ Kompendium habe ich dazu nichts weiter gefunden. Mal schnell in Java probiert: da geht es.</p>
<p>Nun wollt ich wissen: ist das standardkonform oder ein Compilerproblem?<br />
Und wenn es standardkonform ist, wie kann man sowas elegant lösen? Mir würde jetzt nur einfallen, dass render public zu machen.</p>
<p>MfG Pellaeon</p>
<p>PS: Das muchRenderObjects[i]-&gt;render(); ist nur vereinfacht und steht natürlich nicht alleine im Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1540372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540372</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Thu, 03 Jul 2008 11:47:31 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Vererbungsstruktur und proteced on Thu, 03 Jul 2008 11:47:01 GMT]]></title><description><![CDATA[<p>Du musst die Klasse schon vererben.</p>
<pre><code class="language-cpp">class KindB : public Basis
{
   // ...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1540373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540373</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 03 Jul 2008 11:47:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Vererbungsstruktur und proteced on Thu, 03 Jul 2008 11:48:00 GMT]]></title><description><![CDATA[<p>sry die erben, habs nur vergessen reinzuschreiben im Bsp Code jetzt isses drinne</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1540376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540376</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Thu, 03 Jul 2008 11:48:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Vererbungsstruktur und proteced on Thu, 03 Jul 2008 12:19:50 GMT]]></title><description><![CDATA[<p>render in Basis ist doch rein virtuell. Was willst du da aufrufen? Wie hast du diese Basisobjekte überhaupt erstellt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1540400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540400</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 03 Jul 2008 12:19:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Vererbungsstruktur und proteced on Thu, 03 Jul 2008 13:02:52 GMT]]></title><description><![CDATA[<p>Pellaeon schrieb:</p>
<blockquote>
<p>... Nun wollt ich wissen: ist das standardkonform oder ein Compilerproblem? Und wenn es standardkonform ist, wie kann man sowas elegant lösen? Mir würde jetzt nur einfallen, dass render public zu machen. ...</p>
</blockquote>
<p>Wenn ich dein Programm richtig interpretiere, dann sind durch</p>
<pre><code class="language-cpp">std::vector&lt;Basis*&gt; muchRenderObjects;
</code></pre>
<p>in der Klasse KindB Zeiger auf verschiedene <strong>unabhängige</strong> Objekte der Basisklasse definiert.</p>
<p>Auch abgeleitete Klassen haben auf unabhängige Objekte ihrer Basisklassen nur den Zugriff, denn alle anderen haben. D.h. um auf eine Methode zuzugreifen müsste sie auch öffentlich sein.</p>
<p>Es ist schwer zu sagen, was du nun machen könntest, da deine Methode sowieso rein virtuell ist. Normalerweise könnte man das Problem beseitigen indem man die abgeleitete Klasse zum friend der Basisklasse macht.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1540422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540422</guid><dc:creator><![CDATA[vic1986]]></dc:creator><pubDate>Thu, 03 Jul 2008 13:02:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Vererbungsstruktur und proteced on Mon, 07 Jul 2008 12:56:13 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>also ich hab jetzt erstmal eine friend-Deklaration hineingemacht.<br />
Und da habe ich auch noch eine Frage dazu.<br />
Ich benutzte STL-Algorithmen, welche auch auf das Render zugreifen sollen. Meine Funktionsobjekte besitzen da jetzt natürlich erstmal keine Rechte auf die protected-Methode. Soweit so normal. Nun habe ich folgendes direkt in der Klasse definiert:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct Render : std::unary_function&lt;T,void&gt;
{
	void operator() (T* arg)
	{
		arg-&gt;render();
	}
};
</code></pre>
<p>Also wenn ich auf mein Bsp im ersten Post zurück komme, dann wäre diese Struktur innerhalb der Klasse <strong>KindB</strong> und Klasse <strong>Basis</strong> hat eine friend-Deklaration auf <strong>KindB</strong>.</p>
<p>Instanzen diese Struktur wird dann auch innerhalb von Methoden von KindB genutzt.<br />
Meine Frage: ist das legaler ISO C++ Code? Weil ich hab Compiler die nehmen das ohne Fehler und Warnungen, andere dagegen meckern, dass auf render kein Zugriff gestattet ist.</p>
<p>MfG Pellaeon</p>
<p>Edit: also in Quellcode ausgedrückt, sowas:</p>
<pre><code class="language-cpp">class Basis
{
friend class KindB;
protected:
    virtual void render() = 0;
};

class KindA : public Basis
{
protected:
    virtual void render() { //impl ... }

};

class KindB : public Basis
{
protected:
    virtual void render() { muchRenderObjects[i]-&gt;render(); }   //Compilefehler

private:
    std::vector&lt;Basis*&gt; muchRenderObjects;

    template&lt;typename T&gt;
    struct Render : std::unary_function&lt;T,void&gt;
    {
	    void operator() (T* arg)
	    {
		    arg-&gt;render();
	    }
    };
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1542605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1542605</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 07 Jul 2008 12:56:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Vererbungsstruktur und proteced on Mon, 07 Jul 2008 20:07:55 GMT]]></title><description><![CDATA[<p>*push*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1543006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1543006</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 07 Jul 2008 20:07:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Vererbungsstruktur und proteced on Mon, 07 Jul 2008 20:19:21 GMT]]></title><description><![CDATA[<p>*pop*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1543009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1543009</guid><dc:creator><![CDATA[Gilad]]></dc:creator><pubDate>Mon, 07 Jul 2008 20:19:21 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Vererbungsstruktur und proteced on Tue, 08 Jul 2008 08:19:30 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<blockquote>
<p>Meine Frage: ist das legaler ISO C++ Code? Weil ich hab Compiler die nehmen das ohne Fehler und Warnungen, andere dagegen meckern, dass auf render kein Zugriff gestattet ist.</p>
</blockquote>
<p>Für mich ist das standardkonformer Code... (ausser, dass das <em>i</em> in der <em>render</em>-Definition der <em>KindB</em>-Klasse undefiniert ist, aber die Schleife habe ich mir dazu gedacht ;))</p>
<p>MfG,</p>
<p>Probe-Nutzer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1543163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1543163</guid><dc:creator><![CDATA[Probe-Nutzer]]></dc:creator><pubDate>Tue, 08 Jul 2008 08:19:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Vererbungsstruktur und proteced on Tue, 08 Jul 2008 10:20:18 GMT]]></title><description><![CDATA[<p>[unsinn]...[/unsinn]</p>
<p>Edit: jo sieht korrekt aus. <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/1543261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1543261</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Tue, 08 Jul 2008 10:20:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Vererbungsstruktur und proteced on Tue, 08 Jul 2008 11:35:37 GMT]]></title><description><![CDATA[<p>Folgende Antwort habe woanders bekommen:</p>
<p>Danny schrieb:</p>
<blockquote>
<p>Let's simplify the question. Essentially, you want to know whether an embedded class can access non-public members of its enclosing class (either inherited or defined in the enclosing class itself). The answer is no. An embedded class is like any other class. It can only access public members of its enclosing class, unless it's a friend.</p>
</blockquote>
<p>Nach dieser Erklärung wäre mein Code also falsch und der Compiler macht es nicht richtig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1543332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1543332</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Tue, 08 Jul 2008 11:35:37 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Vererbungsstruktur und proteced on Tue, 08 Jul 2008 11:39:57 GMT]]></title><description><![CDATA[<p>Pellaeon schrieb:</p>
<blockquote>
<p>wenn ich in KindB auf Basis-Objekte die Methode render() anwenden will, hab ich keine Rechte auf die protected-Methode zuzugreifen.<br />
Ich dachte, dass geht?</p>
</blockquote>
<p>protected erlaubt den Zugriff auf Elemente von Basisklassensubobjekten von Objekten der abgeleiteten Klasse, nicht auf beliebige Objekte der Basisklasse. Um diese sicherzustellen, muss der Objektparameter vom Typ der abgeleiteten Klasse sein (wenn wir auf nicht-statische Elemente zugreifen sollen). Also</p>
<pre><code class="language-cpp">struct Base
{
protected:
    void foo();
};
struct Derived2 : Base {};
struct Derived2 : Base
{
    void bar(Base* p)
    {
        foo(); // ok, implizit in this-&gt;foo() umgewandelt
        Base::foo(); // ok, dito
        this-&gt;foo(); // ok
        this-&gt;Base::foo(); // ok ...
        ((Base*)this)-&gt;foo(); // Fehler
        p-&gt;foo(); // Fehler, könnte ja z.B. eine Basis von Derived1 sein, Derived2 hat dort nichts zu suchen
     }
};
</code></pre>
<p>in</p>
<pre><code class="language-cpp">muchRenderObjects[i]-&gt;render();
</code></pre>
<p>ist der Typ des Objektparameters Basis und nicht KindB - es gibt keine Garantie, dass diese Zeiger auf Subobjekte von KindB-Objekten zeigen, also ist dies nicht erlaubt.</p>
<p>Mit der verschachtelten Klasse klappt es auch nicht. Eine verschachtelte Klasse hat keine besonderen Zugriffsrechte auf die umliegende Klasse und friendship ist nicht transitiv; das friend class KindB; wirkt sich nur auf Definitionen für Member der Klasse KindB aus, nicht auf Member von Membern (also die Member der verschachtelten Klasse).<br />
Die Frage, ob verschachtelte Klassen Zugriff auf Member der umschließenden Klasse haben, ist relativ alt, und wurde lange nicht ganz einheitlich behandelt. Aus diesem Grunde gibt es noch einige Compiler, die hier mehr Zugriff gewähren, als eigentlich zulässig ist, nicht zuletzt aus Kompatibilitätsgründen mit existierendem Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1543341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1543341</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 08 Jul 2008 11:39:57 GMT</pubDate></item></channel></rss>