<?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[Problem beim Erben]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe ein Problem, wenn ich versuche von einer Klasse zu erben:</p>
<p>Meine Kindklasse ruft im Konstruktor den Konstruktor der Basisklasse auf, um so einige Werte zu initialisieren, jedoch werden diese Werte in der Erbenden Klasse nicht &quot;aktualisiert&quot;???</p>
<p>Etwa so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class a {
    public:
        a() {}
        a(int num) { 
            m_num = num; 
            std::cout &lt;&lt; &quot;A: &quot; &lt;&lt; m_num &lt;&lt; std::endl
        }
    protected:
        int m_num;
};

class b : public a {
    public:
        b() {}
        b(int num) {
            a::a(num);
            std::cout &lt;&lt; &quot;B: &quot; &lt;&lt;  m_num &lt;&lt; std::endl;
        }
};

int main() {
    b B(7);

    return 0;
}
</code></pre>
<p>Ausgabe:</p>
<p>A: 7<br />
B: Irgendetwas (Manchmal 1, manchmal 16...)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/260324/problem-beim-erben</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 04:29:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/260324.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 03 Feb 2010 17:02:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem beim Erben on Wed, 03 Feb 2010 17:04:04 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe ein Problem, wenn ich versuche von einer Klasse zu erben:</p>
<p>Meine Kindklasse ruft im Konstruktor den Konstruktor der Basisklasse auf, um so einige Werte zu initialisieren, jedoch werden diese Werte in der Erbenden Klasse nicht &quot;aktualisiert&quot;???</p>
<p>Etwa so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class a {
    public:
        a() {}
        a(int num) { 
            m_num = num; 
            std::cout &lt;&lt; &quot;A: &quot; &lt;&lt; m_num &lt;&lt; std::endl
        }
    protected:
        int m_num;
};

class b : public a {
    public:
        b() {}
        b(int num) {
            a::a(num);
            std::cout &lt;&lt; &quot;B: &quot; &lt;&lt;  m_num &lt;&lt; std::endl;
        }
};

int main() {
    b B(7);

    return 0;
}
</code></pre>
<p>Ausgabe:</p>
<p>A: 7<br />
B: Irgendetwas (Manchmal 1, manchmal 16...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849953</guid><dc:creator><![CDATA[Samyboy]]></dc:creator><pubDate>Wed, 03 Feb 2010 17:04:04 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Erben on Wed, 03 Feb 2010 17:11:15 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Du musst hier Initialisierungslisten verwenden.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class a {
    public:
        a() {}
        a(int num) : m_num(num)
        {
            std::cout &lt;&lt; &quot;A: &quot; &lt;&lt; m_num &lt;&lt; std::endl
        }
    protected:
        int m_num;
};

class b : public a {
    public:
        b() {}
        b(int num) : a(num)
        {
            std::cout &lt;&lt; &quot;B: &quot; &lt;&lt;  m_num &lt;&lt; std::endl;
        }
};

int main() {
    b B(7);

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1849959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849959</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 03 Feb 2010 17:11:15 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Erben on Wed, 03 Feb 2010 17:14:08 GMT]]></title><description><![CDATA[<p>Dankeschön!</p>
<p>Weshalb ist das denn so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849962</guid><dc:creator><![CDATA[Samyboy]]></dc:creator><pubDate>Wed, 03 Feb 2010 17:14:08 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Erben on Wed, 03 Feb 2010 17:22:09 GMT]]></title><description><![CDATA[<p>Erst mal eine Frage. Hat deine Variante überhaupt compiliert? Bei mir geht das nämlich nicht.<br />
Falls das doch geht, wird hier wahrscheinlich nur ein temporäres Objekt vom Typ a im Konstruktor von b angelegt. Dieses hat natürlich keinen Einfluss auf das b-Objekt selbst.<br />
An sich kann man Konstruktoren nämlich so nicht direkt aufrufen sondern nur in der Initialisierungsliste einer abgeleiteten Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849968</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 03 Feb 2010 17:22:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Erben on Wed, 03 Feb 2010 17:25:42 GMT]]></title><description><![CDATA[<p>Samyboy schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class a {
    public:
        a() {}
        a(int num) { 
            m_num = num; 
            std::cout &lt;&lt; &quot;A: &quot; &lt;&lt; m_num &lt;&lt; std::endl
        }
    protected:
        int m_num;
};
</code></pre>
</blockquote>
<p>Ist der Default-Konstruktor sinnvoll? Er macht ja nichts und erlaubt es, eigentlich uninitialisierte Objekte vom Typ 'a' zu erzeugen.</p>
<blockquote>
<pre><code class="language-cpp">class b : public a {
    public:
        b() {}
        b(int num) {
            a::a(num);
            std::cout &lt;&lt; &quot;B: &quot; &lt;&lt;  m_num &lt;&lt; std::endl;
        }
};
</code></pre>
</blockquote>
<p>Dieser Konstruktor ruft automatisch (compiler-generiert) Deinen Default-Konstruktor von A auf, der ja nichts macht. Das passiert quasi vor der {-Klammer. Dann erstellst Du temporär ein weiteres A-Objekt (mit <code>a::a(num);</code> ), welches gleich darauf wieder zerstört wird mit dem Semikolon. Bei einer abstrakten Basisklasse wäre das sofort aufgefallen, weil eine abstrakte Klasse nie der dynamische Typ eines Objektes sein kann.</p>
<p>Folgendes noch zum Überlegen:<br />
- Ist das vielleicht ein Missbrauch der Vererbung?<br />
- Sollten die Konstruktoren, die einen <code>int</code> nehmen, <code>explicit</code> sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849969</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 03 Feb 2010 17:25:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Erben on Wed, 03 Feb 2010 17:26:49 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Erst mal eine Frage. Hat deine Variante überhaupt compiliert? Bei mir geht das nämlich nicht.<br />
Falls das doch geht, wird hier wahrscheinlich nur ein temporäres Objekt vom Typ a im Konstruktor von b angelegt. Dieses hat natürlich keinen Einfluss auf das b-Objekt selbst.<br />
An sich kann man Konstruktoren nämlich so nicht direkt aufrufen sondern nur in der Initialisierungsliste einer abgeleiteten Klasse.</p>
</blockquote>
<p>Joa, der Code hat bei mir kompiliert <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>
<p>Dankeschön für die Erläuterung!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849971</guid><dc:creator><![CDATA[Samyboy]]></dc:creator><pubDate>Wed, 03 Feb 2010 17:26:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Erben on Wed, 03 Feb 2010 17:29:18 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Samyboy schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class a {
    public:
        a() {}
        a(int num) { 
            m_num = num; 
            std::cout &lt;&lt; &quot;A: &quot; &lt;&lt; m_num &lt;&lt; std::endl
        }
    protected:
        int m_num;
};
</code></pre>
</blockquote>
<p>Ist der Default-Konstruktor sinnvoll? Er macht ja nichts und erlaubt es, eigentlich uninitialisierte Objekte vom Typ 'a' zu erzeugen.</p>
<blockquote>
<pre><code class="language-cpp">class b : public a {
    public:
        b() {}
        b(int num) {
            a::a(num);
            std::cout &lt;&lt; &quot;B: &quot; &lt;&lt;  m_num &lt;&lt; std::endl;
        }
};
</code></pre>
</blockquote>
<p>Dieser Konstruktor ruft automatisch (compiler-generiert) Deinen Default-Konstruktor von A auf, der ja nichts macht. Das passiert quasi vor der {-Klammer. Dann erstellst Du temporär ein weiteres A-Objekt (mit <code>a::a(num);</code> ), welches gleich darauf wieder zerstört wird mit dem Semikolon. Bei einer abstrakten Basisklasse wäre das sofort aufgefallen, weil eine abstrakte Klasse nie der dynamische Typ eines Objektes sein kann.</p>
<p>Folgendes noch zum Überlegen:<br />
- Ist das vielleicht ein Missbrauch der Vererbung?<br />
- Sollten die Konstruktoren, die einen <code>int</code> nehmen, <code>explicit</code> sein?</p>
</blockquote>
<p>Hallo,</p>
<p>Danke erstmal für deine Antwort!</p>
<p>Also das oben macht gar keinen Sinn, du hast Recht :D.</p>
<p>Und &quot;explicit&quot; hab ich noch nie gehört, werd mal Googeln und mich weiterbilden xD</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849975</guid><dc:creator><![CDATA[Samyboy]]></dc:creator><pubDate>Wed, 03 Feb 2010 17:29:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Erben on Wed, 03 Feb 2010 17:30:15 GMT]]></title><description><![CDATA[<p>Nochwas zum Überlegen.<br />
Sollte der Defaultkonstruktor nicht die Membervariablen mit sinnvollen Werten belegen sofern diese nicht selbst einen Konstruktor haben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849977</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 03 Feb 2010 17:30:15 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Erben on Wed, 03 Feb 2010 18:13:58 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Nochwas zum Überlegen.<br />
Sollte der Defaultkonstruktor nicht die Membervariablen mit sinnvollen Werten belegen sofern diese nicht selbst einen Konstruktor haben?</p>
</blockquote>
<p>Und was zum davor-überlegen: macht es überhaupt immer Sinn, einen Default-Ctor zu haben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849998</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 03 Feb 2010 18:13:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Erben on Thu, 04 Feb 2010 11:57:08 GMT]]></title><description><![CDATA[<p>Das weiß man erst wenn man die Anwendung kennt. Natürlich würde es hier auch ein default Parameter tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1850344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1850344</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 04 Feb 2010 11:57:08 GMT</pubDate></item></channel></rss>