<?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[Erben von abstrakter Klasse]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche, von einer abstrakten Klasse zu erben (nennen wir sie A). Die erbende Klasse (=B) soll ebenfalls abstrakt sein.<br />
A hat bereits einen Konstruktor implementiert. Das will ich für B allerdings nicht. Ich möchte den Konstruktor von A erst von C aufrufen (C erbt von B). Also dann sowas haben wie</p>
<pre><code class="language-cpp">C() : A() {
// Konstruktor...
}
</code></pre>
<p>Ist das so überhaupt möglich? Wenn ich das machen will, bekomme ich eine Fehlermeldung</p>
<pre><code>B.h: In constructor ‘B::B()’:
../B.h:14: error: no matching function for call to ‘A::A()’
../A.h:25: note: candidates are: ...
</code></pre>
<p>Scheint so, als kann man das, was ich vor habe nicht machen? Muss man also alle Konstruktoren nacheinander implementieren (also zumindest durchreichen)? Oder geht es doch und ich machen irgend einen Fehler?</p>
<p>Danke,</p>
<p>C++Dummy</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/259889/erben-von-abstrakter-klasse</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 16:26:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/259889.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 28 Jan 2010 21:11:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Erben von abstrakter Klasse on Thu, 28 Jan 2010 21:11:36 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche, von einer abstrakten Klasse zu erben (nennen wir sie A). Die erbende Klasse (=B) soll ebenfalls abstrakt sein.<br />
A hat bereits einen Konstruktor implementiert. Das will ich für B allerdings nicht. Ich möchte den Konstruktor von A erst von C aufrufen (C erbt von B). Also dann sowas haben wie</p>
<pre><code class="language-cpp">C() : A() {
// Konstruktor...
}
</code></pre>
<p>Ist das so überhaupt möglich? Wenn ich das machen will, bekomme ich eine Fehlermeldung</p>
<pre><code>B.h: In constructor ‘B::B()’:
../B.h:14: error: no matching function for call to ‘A::A()’
../A.h:25: note: candidates are: ...
</code></pre>
<p>Scheint so, als kann man das, was ich vor habe nicht machen? Muss man also alle Konstruktoren nacheinander implementieren (also zumindest durchreichen)? Oder geht es doch und ich machen irgend einen Fehler?</p>
<p>Danke,</p>
<p>C++Dummy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1846714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846714</guid><dc:creator><![CDATA[C++Dummy]]></dc:creator><pubDate>Thu, 28 Jan 2010 21:11:36 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von abstrakter Klasse on Thu, 28 Jan 2010 21:16:58 GMT]]></title><description><![CDATA[<p>C++Dummy schrieb:</p>
<blockquote>
<p>Ist das so überhaupt möglich? Wenn ich das machen will, bekomme ich eine Fehlermeldung</p>
</blockquote>
<p>Nein, geht nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1846717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846717</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 28 Jan 2010 21:16:58 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von abstrakter Klasse on Thu, 28 Jan 2010 21:19:45 GMT]]></title><description><![CDATA[<p>Sobald du einen Konstruktor definierst (Ausnahme der parameterlose Standardkonstuktors) musst du beim<br />
inititalisieren einer abgeleiteten Klasse den Konstruktor der Basisklasse angeben, sofern die Baisklasse keinen Standardkonstruktor besitzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1846721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846721</guid><dc:creator><![CDATA[Uwe1010]]></dc:creator><pubDate>Thu, 28 Jan 2010 21:19:45 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von abstrakter Klasse on Thu, 28 Jan 2010 22:00:02 GMT]]></title><description><![CDATA[<p>Du kannst Basisinitialisierung nur mit direkter Basisklasse machen.<br />
Bei deiner Hierarchie<br />
A -&gt; B -&gt; C<br />
werden beim Anlegen eines C-Objektes von unten weg alle Basisklassen nacheinander initialisiert.<br />
Erst A, dann B, dann C. Wenn du also an die Stelle der Basisinitialisierung von C kommst hast du bereits ein vollständig initialisiertes B, demnach auch ein vollständig initialisiertes A. Zweimalige Initialisierung einer Basis geht nicht (GCC meldet mir das AFAIK auch genau so).</p>
<p>// edit:<br />
Hab das mal kurz ausprobiert, hier der Fehler:</p>
<pre><code>main.cpp: In constructor »C::C()«:
main.cpp:17: Fehler: Typ »A« ist keine direkte Basis von »C«
</code></pre>
<p>Hier Code:</p>
<pre><code class="language-cpp">struct C : public B
{
  C() : A(15) // &lt;---
  {}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1846748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846748</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Thu, 28 Jan 2010 22:00:02 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von abstrakter Klasse on Thu, 28 Jan 2010 22:24:58 GMT]]></title><description><![CDATA[<p>Die direkte Initialisierung aus der dem Konstruktor der am weitesten abgeleiteten Klasse heraus ist möglich und erforderlich, wenn es sich um eine virtuelle Basisklasse handelt. Ob das in diesem Falle sinnvoll ist, kann ich allerdings nicht beantworten, schließlich wird keine Begründung geliefert, warum diese atypische Initialisierung gewünscht ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1846768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846768</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 28 Jan 2010 22:24:58 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von abstrakter Klasse on Fri, 29 Jan 2010 08:55:02 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>:<br />
Wie macht man das dann?<br />
Und warum bei virtuellen Basisklassen? Ich bin bisher immer davon ausgegangen, dass egal wie die Basis aussieht, sie ist immer vor Eintritt in den Konstruktorbody der abgeleiteten Klasse vollständig initialisiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1846882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846882</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Fri, 29 Jan 2010 08:55:02 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von abstrakter Klasse on Fri, 29 Jan 2010 09:38:37 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>:<br />
Wie macht man das dann?<br />
Und warum bei virtuellen Basisklassen? Ich bin bisher immer davon ausgegangen, dass egal wie die Basis aussieht, sie ist immer vor Eintritt in den Konstruktorbody der abgeleiteten Klasse vollständig initialisiert.</p>
</blockquote>
<p>Korrekt.</p>
<pre><code class="language-cpp">struct A { A(int) {} };
struct B : virtual A { B()
  : A(0) // dieser Teil wird nicht ausgeführt, falls B nicht der Typ der am weitesten abgeleiteten Klasse ist. Die Ausdrücke für die Konstruktorparameter von A werden dann nicht ausgewertet
{} };
struct C : B { C() : A(1), B() {} };
int main()
{
    B b; // A-Subobjekt mit 0 initialisiert
    C c; // A-Subobjekt mit 1 initialisiert
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1846899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846899</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 29 Jan 2010 09:38:37 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von abstrakter Klasse on Fri, 29 Jan 2010 10:19:10 GMT]]></title><description><![CDATA[<p>Ah! Besten Dank.<br />
Ich hab auch mal nach virtual inheritance gesucht und bin darauf gestoßen:<br />
<a href="http://en.allexperts.com/q/C-1040/virtual-inheritance.htm" rel="nofollow">http://en.allexperts.com/q/C-1040/virtual-inheritance.htm</a><br />
Ich denke ich brauch doch noch den Stroustroup, da sind ja einige Sprachfeatures noch gänzlich unbekannt...<br />
Wird da auch genau beschrieben, wie man operator new (speziell operator new mit fixer size) implementiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1846916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846916</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Fri, 29 Jan 2010 10:19:10 GMT</pubDate></item></channel></rss>