<?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[Sichtbarkeit bei Vererbung]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klasse Base:</p>
<pre><code class="language-cpp">class Base {
protected:
   virtual void postUpdate() { }
public:
   void update() {  postUpdate(); }
};
</code></pre>
<p>und von der leite ich jetzt ab und überschreibe postUpdate. Allerdings ändere ich die Sichtbarkeit von postUpdate auf private:</p>
<pre><code class="language-cpp">class Derived : Base {
private:
   virtual void postUpdate() { }

};
</code></pre>
<p>Zu meinem Erstaunen funktioniert das. Ich dachte man kann in Kindklassen die Sichtbarkeit nur erweitern? Also z.b. von protected auf public. Aber wieso kann ich sie hier einschränken?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246824/sichtbarkeit-bei-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Sun, 05 Apr 2026 11:35:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246824.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 02 Aug 2009 12:56:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Sichtbarkeit bei Vererbung on Sun, 02 Aug 2009 12:56:04 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klasse Base:</p>
<pre><code class="language-cpp">class Base {
protected:
   virtual void postUpdate() { }
public:
   void update() {  postUpdate(); }
};
</code></pre>
<p>und von der leite ich jetzt ab und überschreibe postUpdate. Allerdings ändere ich die Sichtbarkeit von postUpdate auf private:</p>
<pre><code class="language-cpp">class Derived : Base {
private:
   virtual void postUpdate() { }

};
</code></pre>
<p>Zu meinem Erstaunen funktioniert das. Ich dachte man kann in Kindklassen die Sichtbarkeit nur erweitern? Also z.b. von protected auf public. Aber wieso kann ich sie hier einschränken?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753977</guid><dc:creator><![CDATA[mendelerbse]]></dc:creator><pubDate>Sun, 02 Aug 2009 12:56:04 GMT</pubDate></item><item><title><![CDATA[Reply to Sichtbarkeit bei Vererbung on Sun, 02 Aug 2009 13:05:29 GMT]]></title><description><![CDATA[<p>mendelerbse schrieb:</p>
<blockquote>
<p>Aber wieso kann ich sie hier einschränken?</p>
</blockquote>
<p>Weil es erlaubt ist. Oder was willst du hören?<br />
Man kann <code>public</code> , <code>protected</code> oder <code>private</code> vererben. <code>public</code> und <code>private</code> haben durchaus einen Sinn, bei <code>protected</code> ist es mir bisher noch nicht klar geworden.</p>
<p>Eine <code>private</code> Veerbung kann man zum Beispiel für sowas verwenden:</p>
<pre><code class="language-cpp">class AbstractObject
{
protected:
  virtual void specialise() const = 0;

public:
  void doSomething() const;
};

// Jetzt möchte ich ein ganz spezielles AbstractObject verwende,
// es wird allerdings nur einmal vorkommen und sich in der Klasse
// Foo befinden. Statt einer neuen Klasse zu erstellen, kann
// ich eine private Vererbung machen.
class Foo
  : private AbstractObject
{
private:
  virtual void specialise() const
  {
    // was spezielles ;)
  }
};
</code></pre>
<p>Eine <code>private</code> Vererbung ist also grundsätzlich eine <em>has-a</em> Beziehung, allerdings kann man das Objekt noch spezialisieren, da man Zugriff auf den <code>protected</code> Bereich hat.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753979</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 02 Aug 2009 13:05:29 GMT</pubDate></item><item><title><![CDATA[Reply to Sichtbarkeit bei Vererbung on Sun, 02 Aug 2009 13:17:55 GMT]]></title><description><![CDATA[<p>Du hast meine Frage nicht verstanden. Hab allerdings auch einen Fehler in meinem Code: Es muss heißen class Derived : public Base - also ne stink normale public Vererbung. Es geht mir hier um die Änderung der Sichtbarkeit einer METHODE!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753982</guid><dc:creator><![CDATA[mendelerbse]]></dc:creator><pubDate>Sun, 02 Aug 2009 13:17:55 GMT</pubDate></item><item><title><![CDATA[Reply to Sichtbarkeit bei Vererbung on Sun, 02 Aug 2009 13:46:51 GMT]]></title><description><![CDATA[<p>mendelerbse schrieb:</p>
<blockquote>
<p>Du hast meine Frage nicht verstanden. Hab allerdings auch einen Fehler in meinem Code: Es muss heißen class Derived : public Base - also ne stink normale public Vererbung. Es geht mir hier um die Änderung der Sichtbarkeit einer METHODE!</p>
</blockquote>
<p>Achso, das ist kein Problem. Die Signatur der Funktion ist unabhängig von der Sichtbarkeit und damit die Polymorphie zieht, muss nur die Signatur gleich sein. Man kann also eine ableitende Klasse nicht dazu zwingen, die virtuellen Funktionen in irgendeiner Sichtbarkeit zu halten. Jede Klasse bestimmt dies ganz alleine.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753987</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 02 Aug 2009 13:46:51 GMT</pubDate></item><item><title><![CDATA[Reply to Sichtbarkeit bei Vererbung on Sun, 02 Aug 2009 14:02:43 GMT]]></title><description><![CDATA[<p>Mh, so ganz versteh ich das noch nicht. Ich kann doch zb nicht einfach eine public virtual methode in Base in der Derived Klasse zu einer proteced oder gar private methode machen? Das würde doch dieses Liskow Substitute Principle Ding (oder wie das heißt) verletzen. Sprich das hier:</p>
<pre><code class="language-cpp">class Base {
public:
virtual void foo() { }
};
class Derived : public Base {
proteced:
virtual void foo() { }
};

Base* b = new Derived();
b-&gt;foo(); // Aufruf geht nicht mehr (?), obwohl Base sagt, dass foo public ist
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1753990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753990</guid><dc:creator><![CDATA[mendelerbse]]></dc:creator><pubDate>Sun, 02 Aug 2009 14:02:43 GMT</pubDate></item><item><title><![CDATA[Reply to Sichtbarkeit bei Vererbung on Sun, 02 Aug 2009 14:13:13 GMT]]></title><description><![CDATA[<p>mendelerbse schrieb:</p>
<blockquote>
<p>Mh, so ganz versteh ich das noch nicht. Ich kann doch zb nicht einfach eine public virtual methode in Base in der Derived Klasse zu einer proteced oder gar private methode machen? Das würde doch dieses Liskow Substitute Principle Ding (oder wie das heißt) verletzen. Sprich das hier:</p>
<pre><code class="language-cpp">class Base {
public:
virtual void foo() { }
};
class Derived : public Base {
proteced:
virtual void foo() { }
};

Base* b = new Derived();
b-&gt;foo(); // Aufruf geht nicht mehr (?), obwohl Base sagt, dass foo public ist
</code></pre>
</blockquote>
<p>Der Aufruf funktioniert sehr wohl. Die Erreichbarkeit von Membern hängt nur vom statischen Typ des Objektes ab und wird folglich nur beim Compilieren überprüft.</p>
<pre><code class="language-cpp">Derived d;
d.foo(); // fehler
Base&amp; b = d;
b.foo(); // ok
</code></pre>
<p>LSP ist also nicht verletzt, was allerdings auch nicht der entscheidende Maßstab ist. Denn natürlich kann die Sprache dich nicht daran hindern, eine Funktion so zu überschreiben, dass ihr Verhalten nicht mehr zu dem der Basisklasse passt. Es drängt sich kein Grund auf, der die Veränderung der Erreichbarkeit von Membern in beliebiger Weise verbieten müsste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753997</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 02 Aug 2009 14:13:13 GMT</pubDate></item><item><title><![CDATA[Reply to Sichtbarkeit bei Vererbung on Sun, 02 Aug 2009 14:19:00 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Es drängt sich kein Grund auf, der die Veränderung der Erreichbarkeit von Membern in beliebiger Weise verbieten müsste.</p>
</blockquote>
<p>Finde ich schon. Wenn ich public ableite, dann sagte ich, dass Derived ein Base IST. Ist doch dann bescheuert, wenn ich aber bestimmte Methoden von Base nicht mehr aufrufen kann. Dadurch ist Derived ja kein Base mehr. Leuchtet mir absolut nicht ein, wieso nicht nur eine Erweiterung der Sichtbarkeit (also von protected auf public etc) erlaubt ist, sondern auch eine Einschränkung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754002</guid><dc:creator><![CDATA[mendelerbse]]></dc:creator><pubDate>Sun, 02 Aug 2009 14:19:00 GMT</pubDate></item><item><title><![CDATA[Reply to Sichtbarkeit bei Vererbung on Sun, 02 Aug 2009 14:38:17 GMT]]></title><description><![CDATA[<p>mendelerbse schrieb:</p>
<blockquote>
<p>Leuchtet mir absolut nicht ein, wieso nicht nur eine Erweiterung der Sichtbarkeit (also von protected auf public etc) erlaubt ist, sondern auch eine Einschränkung.</p>
</blockquote>
<p>Ich denke dein Fehler ist, dass du denkst, dass es die gleiche Funktion einfach überschreibt, was aber nicht der Fall ist. Es wird eine neue Funktion angelegt, welche die alte Funktion überdeckt. Das <code>virtual</code> bindet sie einfach in der <em>vtable</em> noch zusammen. Aber grundsätzlich ist es eine eigenständige Funktion. Soviel zum technischen Aspekt.<br />
Man sollte hier aber natürlich ein wenig vorsichtig sein, da man schnell Verwirrung stiften kann. Aber C++ schreibt halt kein Programmierstil oder sowas vor, sondern erlaubt meistens sehr vieles, was man auch für absolute Verwirrung missbrauchen kann. Bei C++ liegt es halt in der Verantwortung des Programmierers.</p>
<p>Grüssli</p>
<p>PS: WOW! Ein camper! *Fotoapparat auspackt* <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/1754016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754016</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 02 Aug 2009 14:38:17 GMT</pubDate></item></channel></rss>