<?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[Kein protected-Zugriff möglich]]></title><description><![CDATA[<p>Ich war bislang immer davon ausgegangen, daß der Zugriffsschutz auf Klassenebene gilt, aber nun versucht mich mein Compiler vom Gegenteil zu überzeugen:</p>
<pre><code class="language-cpp">class base
{
	int val;
protected:
	int get_val() const {return val;}
	void set_val(int i) {val=i;}
};

class derived : public base
{
public:
	void set_base(const base&amp; other)
	{ set_val(other.get_val()); }
	void set_data(int i)
	{ set_val(i); }
};
</code></pre>
<p>liefert die Meldung:</p>
<blockquote>
<p>test.h(13) : error C2248: &quot;get_val&quot; : Kein Zugriff auf protected Element, dessen Deklaration in der Klasse &quot;base&quot; erfolgte<br />
test.h(5) : Siehe Deklaration von 'get_val'</p>
</blockquote>
<p>base::get_val() ist protected, also sollte die abgeleitete Klasse derived imho auch darauf zugreifen können. Allerdings meldet mir mein Compiler, daß er keinen Zugriff bekommt (bei der set_val()-Methode klappt es dagegen ohne Probleme).</p>
<p>Wer hat nun recht - ich oder der Compiler?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/171862/kein-protected-zugriff-möglich</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 14:10:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/171862.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 30 Jan 2007 08:56:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kein protected-Zugriff möglich on Tue, 30 Jan 2007 08:56:28 GMT]]></title><description><![CDATA[<p>Ich war bislang immer davon ausgegangen, daß der Zugriffsschutz auf Klassenebene gilt, aber nun versucht mich mein Compiler vom Gegenteil zu überzeugen:</p>
<pre><code class="language-cpp">class base
{
	int val;
protected:
	int get_val() const {return val;}
	void set_val(int i) {val=i;}
};

class derived : public base
{
public:
	void set_base(const base&amp; other)
	{ set_val(other.get_val()); }
	void set_data(int i)
	{ set_val(i); }
};
</code></pre>
<p>liefert die Meldung:</p>
<blockquote>
<p>test.h(13) : error C2248: &quot;get_val&quot; : Kein Zugriff auf protected Element, dessen Deklaration in der Klasse &quot;base&quot; erfolgte<br />
test.h(5) : Siehe Deklaration von 'get_val'</p>
</blockquote>
<p>base::get_val() ist protected, also sollte die abgeleitete Klasse derived imho auch darauf zugreifen können. Allerdings meldet mir mein Compiler, daß er keinen Zugriff bekommt (bei der set_val()-Methode klappt es dagegen ohne Probleme).</p>
<p>Wer hat nun recht - ich oder der Compiler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219592</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 30 Jan 2007 08:56:28 GMT</pubDate></item><item><title><![CDATA[Reply to Kein protected-Zugriff möglich on Tue, 30 Jan 2007 09:17:33 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Der Unterschied zwischen den beiden fraglichen Methoden ist ja, das bei set_base ein &quot;fremdes&quot; Objekt bearbeitet werden soll. Der Compiler verweigert das, vermutlich mit dem Hintergedanken : Es könnte ja ein Objekt übergeben werden, das von einer Klasse abgeleitet von Base ist. Diese potentielle Klasse X kann aber ganz eigene Mechanismen haben, die protected-Methoden von Base zu behandeln. Durch die set_base-Methode aber würde diese Behandlung von X aber außer Kraft gesetzt, wenn der Compiler das nicht verhindern würde.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219613</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 30 Jan 2007 09:17:33 GMT</pubDate></item><item><title><![CDATA[Reply to Kein protected-Zugriff möglich on Tue, 30 Jan 2007 09:40:25 GMT]]></title><description><![CDATA[<p>akari schrieb:</p>
<blockquote>
<p>Es könnte ja ein Objekt übergeben werden, das von einer Klasse abgeleitet von Base ist.</p>
</blockquote>
<p>Ja, in dem Zusammenhang <em>soll</em> sogar ein Objekt einer abgeleiteten Klasse übergeben werden (im Original ist die Methode pur virtual, aber das ändert nichts an den Fehlermeldungen). Mein Hintergedanke war, diese Methode für einen internen Datenaustausch zwischen verschiedenen Klassen nutzen zu können.</p>
<blockquote>
<p>Diese potentielle Klasse X kann aber ganz eigene Mechanismen haben, die protected-Methoden von Base zu behandeln. Durch die set_base-Methode aber würde diese Behandlung von X aber außer Kraft gesetzt, wenn der Compiler das nicht verhindern würde.</p>
</blockquote>
<p>Wieso sollte eine andere (womöglich gar nicht existierende) Klasse ein Problem damit haben, daß ich über eine wohldefinierte Schnittstelle auf ihre Daten zugreifen kann? (zumal der Zugriff nur Bestandteile der Basisklasse betrifft)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219635</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 30 Jan 2007 09:40:25 GMT</pubDate></item><item><title><![CDATA[Reply to Kein protected-Zugriff möglich on Tue, 30 Jan 2007 10:05:32 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">class base
{
	int val;
protected:
	int get_val() const {return val;}
	void set_val(int i) {val=i;}
};

class derived : public base
{
public:
	void set_base(const base&amp; other)
	{ set_val(other.get_val()); }
	void set_data(int i)
	{ set_val(i); }
};
</code></pre>
<p>...</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Ich hätte auch meine Hand dafür ins Feuer gelegt, dass das funktioniert.</p>
<p>interessanterweise funktionert aber:</p>
<pre><code class="language-cpp">class base
{
	int val;
protected:
	int get_val() const {return val;}
	void set_val(int i) {val=i;}
};

class derived : public base
{
public:
	void set_base(const derived&amp; other) // &quot;derived&quot; !
	{ set_val(other.get_val()); }
	void set_data(int i)
	{ set_val(i); }
};
</code></pre>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219654</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 30 Jan 2007 10:05:32 GMT</pubDate></item><item><title><![CDATA[Reply to Kein protected-Zugriff möglich on Tue, 30 Jan 2007 10:13:32 GMT]]></title><description><![CDATA[<p>Vielleicht könnte das Statement von Jason ganz interessant für 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><a href="http://groups.google.de/group/microsoft.public.vc.language/browse_thread/thread/38fd5d3c3a9350c9/d01e53b455cb9360?lnk=st&amp;q=error+C2248%3A+protected&amp;rnum=1&amp;hl=de#d01e53b455cb9360" rel="nofollow">http://groups.google.de/group/microsoft.public.vc.language/browse_thread/thread/38fd5d3c3a9350c9/d01e53b455cb9360?lnk=st&amp;q=error+C2248%3A+protected&amp;rnum=1&amp;hl=de#d01e53b455cb9360</a></p>
<p>Gruß,<br />
Baracke</p>
<p>Edit: *hust* Deutsche Sprache schwere Sprache....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219657</guid><dc:creator><![CDATA[Baracke]]></dc:creator><pubDate>Tue, 30 Jan 2007 10:13:32 GMT</pubDate></item><item><title><![CDATA[Reply to Kein protected-Zugriff möglich on Tue, 30 Jan 2007 10:21:23 GMT]]></title><description><![CDATA[<p>Baracke schrieb:</p>
<blockquote>
<p>Vielleicht könnte das Statement von Jason ganz interessant für 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><a href="http://groups.google.de/group/microsoft.public.vc.language/browse_thread/thread/38fd5d3c3a9350c9/d01e53b455cb9360?lnk=st&amp;q=error+C2248%3A+protected&amp;rnum=1&amp;hl=de#d01e53b455cb9360" rel="nofollow">http://groups.google.de/group/microsoft.public.vc.language/browse_thread/thread/38fd5d3c3a9350c9/d01e53b455cb9360?lnk=st&amp;q=error+C2248%3A+protected&amp;rnum=1&amp;hl=de#d01e53b455cb9360</a><br />
...</p>
</blockquote>
<p>Jason Shirk schrieb:</p>
<blockquote>
<p>The compiler is correct. A derived instance can only access protected<br />
members via this. Because n is not this, the context for access checking is<br />
not that of the derived.</p>
<p>If you aren't convinced, Borland, GCC, and Como all agree w/ VC, it's an<br />
error.</p>
<p>Jason Shirk<br />
VC++ Compiler Team</p>
</blockquote>
<p>Hmmmm ... irgendwie bricht das mit einigem, was ich bislang über die Zugriffsrechte zu wissen glaubte ...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219669</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 30 Jan 2007 10:21:23 GMT</pubDate></item><item><title><![CDATA[Reply to Kein protected-Zugriff möglich on Tue, 30 Jan 2007 10:30:07 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>interessanterweise funktionert aber:</p>
<pre><code class="language-cpp">...
</code></pre>
</blockquote>
<p>Ja, das wußte ich selber, aber das ist leider nicht das, was ich benötige. Schließlich will ich als 'other' ja nicht nur derived-Objekte übergeben, sondern auch andere von base abgeleitete Objekte.<br />
(und die momentane Notfalllösung, get_val() public zu setzen, gefällt mir auch nicht)</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Hmmmm ... irgendwie bricht das mit einigem, was ich bislang über die Zugriffsrechte zu wissen glaubte ...</p>
</blockquote>
<p>Ja, das ging mir genauso <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/1219676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219676</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 30 Jan 2007 10:30:07 GMT</pubDate></item><item><title><![CDATA[Reply to Kein protected-Zugriff möglich on Tue, 30 Jan 2007 10:50:35 GMT]]></title><description><![CDATA[<p>Hallo,<br />
darüber kann man leicht stolpern. Der Standard ist hier aber eindeutig. Er legt fest, dass ein Member/Friend einer abgeleiteten Klasse nur über Pointer/Referenzen/Objekte vom Typ abgeleitete Klasse auf die protected-Member der Basisklasse zugreifen kann. Der Grund für diese Einschränkung ist statische Typsicherheit. Gäbe es diese Einschränkung nicht, könnte eine abegeleitete Klasse andere abgeleiete Klassen kaputt machen (weil die z.B. ein protected-Member anders interpretieren).</p>
<p>Ein schönes Beispiel von Jim Hyslop:</p>
<pre><code class="language-cpp">class animal {
protected:
   point3d whereAmI;
// ... etc.
};

class fish : public animal {
// whatever
};

class bird : public animal {
public:
   // birds of a feather...
   void flockTogether(animal &amp;a) const { a.whereAmI = whereAmI; }
};

int main() {
   fish f;
   bird b;
   b.flockTogether(f); // Oops, the bird just drowned.
}
</code></pre>
<p>Oder ein anderer Klassiker:</p>
<pre><code class="language-cpp">class Shape {
public:
	// ...
protected:
	void setHeight(int h) {
          height_ = h;
	}
	void setWidth(int w) {
	  width_ = w;
	}
private:
	int height_;
	int width_;
};

class Square : public Shape {
public:
	void resize(Shape&amp; s) {
		s.setHeight(42);
		s.setWidth(42);
	}
};
class Rectangle : public Shape {
public:
	void resize(Shape&amp; s) {
		s.setHeight(42);
		s.setWidth(8);
	}
};

int main() {
	Square s;
	Rectangle r;
	r.resize(s); // Ups! 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1219687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219687</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Tue, 30 Jan 2007 10:50:35 GMT</pubDate></item><item><title><![CDATA[Reply to Kein protected-Zugriff möglich on Tue, 30 Jan 2007 11:38:03 GMT]]></title><description><![CDATA[<p>Erstaunlich, daß C++ sich so gegen mögliche Designfehler stemmt, aber ist das nicht ein wenig radikal gelöst? Und vor allem: Wie kann ich die Sache angehen, wenn ich wirklich über die Basisklasse auf eine protected Methode zugreifen will?</p>
<p>Zur Untermalung die ungefähre Struktur in meiner Anwendung:</p>
<pre><code class="language-cpp">//Basisklasse (abstrakt)
class base_filter
{
public:
  virtual double calc(...)=0;
protected:
  virtual base_filter* clone()const=0;//kopiert einen Filter
};

//Composite - Verknüpfung mehrerer Filter
class composite_filter
{
  vector&lt;base_filter*&gt; members;
public:
  insert(const base_filter&amp; filt)
  {
    members.push_back(filt.clone());// &lt;- hier kommt C2248
  }

  virtual double calc(...)
  {
    double ret=0;
    for(size_t i=0;i&lt;members.size) ret+=members[i]-&gt;calc(...);
    return ret;
  }
};
</code></pre>
<p>Der composite_filter speichert jeweils eine Kopie der eingefügten filter, weil ich dort auch temporäre Werte reinpacken und die Filter über Funktionsgrenzen weiterreichen will (Stichwort: &quot;virtueller Konstruktor&quot;). Aber ich möchte den Zugriff auf die clone()-Methode für Außenstehende verbieten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219720</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 30 Jan 2007 11:38:03 GMT</pubDate></item><item><title><![CDATA[Reply to Kein protected-Zugriff möglich on Tue, 30 Jan 2007 11:52:31 GMT]]></title><description><![CDATA[<p>Hallo,<br />
hier hilft wie immer die gute alte Indirektion: du hast keinen Zugriff auf clone() über filt. Dafür aber auf die protected-Methoden von base_filter über this. base_filter kann auf alle Member aller base_filter-Objekte zugreifen.<br />
Ergo:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
using namespace std;
class base_filter
{
public:
  virtual double calc()=0;
protected:
  virtual base_filter* clone()const=0;
  // Neu - erzeuge clone von c
  base_filter* clone(const base_filter&amp; c) {
     return c.clone();
  }
};

//Composite - Verknüpfung mehrerer Filter
class composite_filter : public base_filter
{
  vector&lt;base_filter*&gt; members;
public:
  void insert(const base_filter&amp; filt)
  {
    // ok: clone filt über Base::clone(c)
    members.push_back(clone(filt));
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1219730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219730</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Tue, 30 Jan 2007 11:52:31 GMT</pubDate></item><item><title><![CDATA[Reply to Kein protected-Zugriff möglich on Tue, 30 Jan 2007 12:13:18 GMT]]></title><description><![CDATA[<p>Thx, so funktioniert es tatsächlich</p>
<p>oder - wie ein Kollege neulich sagte:</p>
<p>TactX schrieb:</p>
<blockquote>
<p>Man lernt nie aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1219736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219736</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 30 Jan 2007 12:13:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kein protected-Zugriff möglich on Tue, 30 Jan 2007 12:27:47 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>interessanterweise funktionert aber:</p>
<pre><code class="language-cpp">...
</code></pre>
</blockquote>
<p>Ja, das wußte ich selber, aber das ist leider nicht das, was ich benötige....</p>
</blockquote>
<p>Das war auch nicht als Lösung gedacht, sondern grenzt vielleicht ein, wo ich falsch denke ...<br />
(den zitierten Spec-Verweis, aus dem genau das hervorgeht, habe ich erst danach gefunden (Kap. 11.5))</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219746</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 30 Jan 2007 12:27:47 GMT</pubDate></item><item><title><![CDATA[Reply to Kein protected-Zugriff möglich on Tue, 30 Jan 2007 13:15:28 GMT]]></title><description><![CDATA[<p>HumeSikkins schrieb:</p>
<blockquote>
<p>...<br />
Ein schönes Beispiel von Jim Hyslop:</p>
<pre><code class="language-cpp">class animal {
protected:
   point3d whereAmI;
// ... etc.
};

class fish : public animal {
// whatever
};

class bird : public animal {
public:
   // birds of a feather...
   void flockTogether(animal &amp;a) const { a.whereAmI = whereAmI; }
};

int main() {
   fish f;
   bird b;
   b.flockTogether(f); // Oops, the bird just drowned.
}
</code></pre>
</blockquote>
<p>(der Kommentar ist wohl falsch: Der Vogel ist nicht ertrunken, sondern der Fisch fliegt) <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>Erst dachte ich: Hmmm, aber das Beispiel finde ich unbefriedigend - das sieht mehr eher nach einem &quot;const-&quot;-Thema aus als nach &quot;access specification&quot;. Wenn flockTogether() einen non-const-Parameter bekommt, kann es den natürlich ändern ... ist doch irgendwie nichts Besonderes.</p>
<p>... aber mit ein wenig Nachdenken ist es schon klar: Wenn ich protected-Elemente habe, gehe ich davon aus, dass &quot;ich&quot; die ändern kann ... nicht aber, &quot;Geschwister, Onkels und Cousins&quot;.</p>
<p>Anders gesagt: Wenn das anders wäre, würde folgender Hack mit Standardmittel funktioneren:<br />
Guter Programmierer:</p>
<pre><code class="language-cpp">class base
{
protected:
   int val;
};

class derived : public base
{ 
public:
   derived(int i) { val = i;}
// legt val &quot;NICHT nach außen&quot;
};
</code></pre>
<p>Böser Programmierer:</p>
<pre><code class="language-cpp">template &lt;typename BaseT, typename DerivedT, typename VarType&gt;
class hack : public BaseT {
public:
   typedef VarType DerivedT::*dMember;
   static VarType&amp; get(DerivedT&amp; d, dMember dMem) { 
      return d.*dMem;
   }
};

int main(void)
{
   derived d(2);
   hack&lt;base, derived, int&gt;::get(d, &amp;derived::val) += 3; 
// Verändert d.val, obwohl nur derived-Objekte das sollten
// (hat sich der derived-Entwickler eben so ausgedacht)
}
</code></pre>
<p>Danke,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219752</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 30 Jan 2007 13:15:28 GMT</pubDate></item></channel></rss>