<?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[Zugriffsrechte]]></title><description><![CDATA[<p>Hallo könnt ihr mir erklären wie bei den im Kommentar mit ??? markierten Zeilen die entsprechenden Ausgaben bzw. der Compilerfehler zustande kommen.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Basis
{
      protected:
           int a;

      public:
           Basis(int m) : a(m) {}
           int getWert() { return a; }
};

class Abgeleitet : public Basis
{
      private:
           int b;
      public:
           Abgeleitet(int v, int w) : Basis(v), b(w) {}
           int getWert() { return a + b; }
};

int main()
{
    Basis eins(11);
    Abgeleitet zwei(7,9);

    cout &lt;&lt; eins.getWert() &lt;&lt; endl;          // 11
    cout &lt;&lt; zwei.getWert() &lt;&lt; endl;          // 16
    cout &lt;&lt; zwei.Basis::getWert() &lt;&lt; endl;   // 7
    eins = zwei;                            
    cout &lt;&lt; eins.getWert() &lt;&lt; endl;          // 7                    ???
    zwei = eins;                             // Compilerfehler       ???
    cout &lt;&lt; zwei.getWert() &lt;&lt; endl;
    cout &lt;&lt; zwei.a &lt;&lt; endl;                  // Compilerfehler       ???

    char dummy;
    cin &gt;&gt; dummy;
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/117734/zugriffsrechte</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 03:49:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/117734.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Aug 2005 17:44:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zugriffsrechte on Wed, 10 Aug 2005 17:44:11 GMT]]></title><description><![CDATA[<p>Hallo könnt ihr mir erklären wie bei den im Kommentar mit ??? markierten Zeilen die entsprechenden Ausgaben bzw. der Compilerfehler zustande kommen.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Basis
{
      protected:
           int a;

      public:
           Basis(int m) : a(m) {}
           int getWert() { return a; }
};

class Abgeleitet : public Basis
{
      private:
           int b;
      public:
           Abgeleitet(int v, int w) : Basis(v), b(w) {}
           int getWert() { return a + b; }
};

int main()
{
    Basis eins(11);
    Abgeleitet zwei(7,9);

    cout &lt;&lt; eins.getWert() &lt;&lt; endl;          // 11
    cout &lt;&lt; zwei.getWert() &lt;&lt; endl;          // 16
    cout &lt;&lt; zwei.Basis::getWert() &lt;&lt; endl;   // 7
    eins = zwei;                            
    cout &lt;&lt; eins.getWert() &lt;&lt; endl;          // 7                    ???
    zwei = eins;                             // Compilerfehler       ???
    cout &lt;&lt; zwei.getWert() &lt;&lt; endl;
    cout &lt;&lt; zwei.a &lt;&lt; endl;                  // Compilerfehler       ???

    char dummy;
    cin &gt;&gt; dummy;
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/849669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849669</guid><dc:creator><![CDATA[Wernus]]></dc:creator><pubDate>Wed, 10 Aug 2005 17:44:11 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsrechte on Wed, 10 Aug 2005 18:03:56 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">cout &lt;&lt; eins.getWert() &lt;&lt; endl;          // 11
    cout &lt;&lt; zwei.getWert() &lt;&lt; endl;          // 16
    cout &lt;&lt; zwei.Basis::getWert() &lt;&lt; endl;   // 7
    eins = zwei;                            
// nur der Basis-Teil von Abgeleitet wird kopiert.
// mehr geht auch nicht da in eins nicht mehr platz ist 
// nennt sich slicing
    cout &lt;&lt; eins.getWert() &lt;&lt; endl;          // 7                    ???
//   gibt a von zwei aus 
    zwei = eins;                             // Compilerfehler       ???
// eins ist kein Abgeleitet =&gt; fehler
    cout &lt;&lt; zwei.getWert() &lt;&lt; endl;
    cout &lt;&lt; zwei.a &lt;&lt; endl;                  // Compilerfehler       ???
// zwei.a ist protectet =&gt; zugriff nicht erlaubt    
    char dummy;
    cin &gt;&gt; dummy;
    return 0;
}
</code></pre>
<p>Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849678</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Wed, 10 Aug 2005 18:03:56 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsrechte on Wed, 10 Aug 2005 18:10:38 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>1. ausgabe:</p>
<p>Ist 11 weil beim ctor der basis 11 als parameter übergeben wurde. Und getWert liefert nur den wert des members wieder zurück.</p>
<p>2. ausgabe:</p>
<p>Ist 11 weil 7 und 9 als parameter für den ctor von abgeleitet übergeben werden. Der ctor von abgeleitet wiederum ruft den ctor von basis mit dem parameter 7 auf. Der protected member a ist nun mit 7 initialisiert. Dann wird b mit 9 initialisiert. getWert() von abgeleitet gibt die summe von a und b zurück. a ist deswegen verfügbar in abgeleitet weil abgeleitet von basis erbt und damit auf protected-member von basis zugriff hat. Die summe von 9 und 7 ist 16. Stimmt also.</p>
<p>3. ausgabe:<br />
Da wird explizt die getWert methode von basis aufgerufen die wiederum den wert von a zurück gibt, der in der instanz von abgeleitet die du &quot;zwei&quot; nennst 7 ist. Es wird deswegen explizit qualifiziert weil abgeleitet getWert() überschreibt und ohne diese qualifizierung die getWert-methode von abgeleitet aufgerufen werden würde. Dann wäre die ausgabe wieder 16.</p>
<p>4. compilefehler eins = zwei<br />
basis hat den ctor nicht explicit gemacht. Das bedeuted dass basis implicit in int convertiert werden kann. Zwei ist eine instanz von abgeleit. Abgeleitet wiederum IST EINE basis. Als solche also implizit in int convertierbar. Da basis keinen assignment-op implementiert baut der compiler eine standardimplementierung selbes gilt auch für den copy-ctor. Beim zuweisen werden die werte von abgeleitet, also b, abgetrennt. Das ist als slicing bekannt. Der wert von a ist immer noch 7. Dieser wird &quot;eins&quot; zugewiesen. Das geht aus den eben genannten gründen.</p>
<p>5. ausgabe<br />
Der neue wert von a wird ausgegeben der ist wegen 4. nun 7.</p>
<p>6. compilefehler<br />
&quot;abgleitet&quot; IST zwar eine &quot;basis&quot; aber &quot;basis&quot; IST KEIN &quot;abgeleitet&quot;. Hier müsste abgeleitet einen op= für basis implementieren weil der standard op= nicht ausreicht. abgeleitet kann nicht implizit in int convertiert werden.<br />
Deswegen meckert der compiler, weil er nicht weiss wie er die zuweisung machen soll.</p>
<p>7. compilefehler<br />
a ist zwar in abgeleitet verfügbar, aber bleibt nach aussen hin weiter protected. Das heisst der op&lt;&lt; hat kein recht darauf zuzugreifen. Das seigt einem der compiler aber auch.</p>
<p>Hmm garnich so einfach..... ich hoffe man versteht das</p>
<p>//EDIT ok man kanns auch kürzer machen ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849681</guid><dc:creator><![CDATA[prolog]]></dc:creator><pubDate>Wed, 10 Aug 2005 18:10:38 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsrechte on Wed, 10 Aug 2005 18:17:46 GMT]]></title><description><![CDATA[<p>Jo danke für die Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849687</guid><dc:creator><![CDATA[GR_Watto]]></dc:creator><pubDate>Wed, 10 Aug 2005 18:17:46 GMT</pubDate></item></channel></rss>