<?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[Initialisierung bei virtueller Basisklasse]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich bin mir nicht ganz sicher, ob die Benutzung von virtuellen Basisklassen kapiert habe, daher frage ich einfach euch.</p>
<p>Folgender Code:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
class Basis {
        public:
                Basis() {std::cout &lt;&lt; &quot;Basis-Standardkonstruktor\n&quot;;}
                Basis(const char* a) {std::cout &lt;&lt; a &lt;&lt; std::endl;}
                virtual ~Basis() {}
};

class Links : virtual public Basis {
        public:
                Links(const char* a) : Basis(a) {}
};

class Rechts : virtual public Basis {
        public:
                Rechts(const char* a) : Basis(a) {}
};

class Unten : public Links, public Rechts {
        public:
                Unten(const char* a) : Basis(a), Links(a), Rechts(a) {}
};

int main() {
        Unten un(&quot;Unten&quot;);
        Links li(&quot;Links&quot;);
}
</code></pre>
<p>1. Erbt die Klassen &quot;Unten&quot; nicht virtual, weil durch das virtual-Vererben ihrer Oberklassen das Problem mit mehreren Subobjekten schon gelöst wurde?<br />
2. Ist es richtig, dass wegen der virtual-Vererbung beim Aufruf &quot;Unten un(&quot;Unten&quot;);&quot; kein Links::Basis(a) und kein Rechts::Basis(a) durch den Unten-Konstruktor aufgerufen wird?</p>
<p>Danke für eure Antworten. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/191390/initialisierung-bei-virtueller-basisklasse</link><generator>RSS for Node</generator><lastBuildDate>Sat, 26 Sep 2026 00:17:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/191390.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 02 Sep 2007 15:51:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Initialisierung bei virtueller Basisklasse on Sun, 02 Sep 2007 15:51:42 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich bin mir nicht ganz sicher, ob die Benutzung von virtuellen Basisklassen kapiert habe, daher frage ich einfach euch.</p>
<p>Folgender Code:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
class Basis {
        public:
                Basis() {std::cout &lt;&lt; &quot;Basis-Standardkonstruktor\n&quot;;}
                Basis(const char* a) {std::cout &lt;&lt; a &lt;&lt; std::endl;}
                virtual ~Basis() {}
};

class Links : virtual public Basis {
        public:
                Links(const char* a) : Basis(a) {}
};

class Rechts : virtual public Basis {
        public:
                Rechts(const char* a) : Basis(a) {}
};

class Unten : public Links, public Rechts {
        public:
                Unten(const char* a) : Basis(a), Links(a), Rechts(a) {}
};

int main() {
        Unten un(&quot;Unten&quot;);
        Links li(&quot;Links&quot;);
}
</code></pre>
<p>1. Erbt die Klassen &quot;Unten&quot; nicht virtual, weil durch das virtual-Vererben ihrer Oberklassen das Problem mit mehreren Subobjekten schon gelöst wurde?<br />
2. Ist es richtig, dass wegen der virtual-Vererbung beim Aufruf &quot;Unten un(&quot;Unten&quot;);&quot; kein Links::Basis(a) und kein Rechts::Basis(a) durch den Unten-Konstruktor aufgerufen wird?</p>
<p>Danke für eure Antworten. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357355</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Sun, 02 Sep 2007 15:51:42 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung bei virtueller Basisklasse on Sun, 02 Sep 2007 16:42:26 GMT]]></title><description><![CDATA[<p>Weil eine der Basisklassen von Unten (in diesem Falle sogar beide) von der Basis Basis virtuell erbt, tut dies indirekt auch die Klasse Unten selbst. Virtuelle (direkte und indirekte) Basisklassen werden vom Konstruktor des vollständigen Objektes direkt (und vor allen anderen Basisklassen) initialisiert. Kleines Demo:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
using namespace std;

struct A
{
    A(int = 0) { cout &lt;&lt; &quot;body of A::A(int)\n&quot;; }
};

struct B : virtual A
{
    B(int = 0) : A( ( cout &lt;&lt; &quot;B::B(int) calling A::A(int)\n&quot;, 0 ) ) { cout &lt;&lt; &quot;body of B::B(int)\n&quot;; }
};

struct C : virtual A
{
    C(int = 0) : A( ( cout &lt;&lt; &quot;C::C(int) calling A::A(int)\n&quot;, 0 ) ) { cout &lt;&lt; &quot;body of C::C(int)\n&quot;; }
};

struct D : B, C
{
    D(int = 0) : A( ( cout &lt;&lt; &quot;D::D(int) calling A::A(int)\n&quot;, 0 ) ),
             B( ( cout &lt;&lt; &quot;D::D(int) calling B::B(int)\n&quot;, 0 ) ),
             C( ( cout &lt;&lt; &quot;D::D(int) calling C::C(int)\n&quot;, 0 ) )
    { cout &lt;&lt; &quot;body of D::D(int)\n&quot;; }
};

struct E : A  // nicht virtuell
{
    E(int = 0) : A( ( cout &lt;&lt; &quot;E::E(int) calling A::A(int)\n&quot;, 0 ) )
    { cout &lt;&lt; &quot;body of E::E(int)\n&quot;; }
};

struct F : B, C, E // besitzt zwei Subobjekte vom Typ A:
                   // eine virtuelle Basis durch B und C und
                   // eine indirekte nichtvirtuelle Basis durch E (wir könnten auch direkt von A erben,
                   // dann wäre aber jede explizite Verwendung von A mehrdeutig; bereits hier müssen wir qualifizieren:
{
    F(int = 0) : B::A( ( cout &lt;&lt; &quot;F::F(int) calling A::A(int)\n&quot;, 0 ) ),
             B( ( cout &lt;&lt; &quot;F::F(int) calling B::B(int)\n&quot;, 0 ) ),
             C( ( cout &lt;&lt; &quot;F::F(int) calling C::C(int)\n&quot;, 0 ) ),
             E( ( cout &lt;&lt; &quot;F::F(int) calling E::E(int)\n&quot;, 0 ) )
    { cout &lt;&lt; &quot;body of F::F(int)\n&quot;; }
};

int main()
{
    cout &lt;&lt; &quot;****A a; ***\n&quot;; A a;
    cout &lt;&lt; &quot;****B b; ***\n&quot;; B b;
    cout &lt;&lt; &quot;****C c; ***\n&quot;; C c;
    cout &lt;&lt; &quot;****D d; ***\n&quot;; D d;
    cout &lt;&lt; &quot;****E e; ***\n&quot;; E e;
    cout &lt;&lt; &quot;****F f; ***\n&quot;; F f;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1357381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357381</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 02 Sep 2007 16:42:26 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung bei virtueller Basisklasse on Sun, 02 Sep 2007 17:16:31 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>struct B : virtual A<br />
{<br />
B(int = 0) : A( ( cout &lt;&lt; &quot;B::B(int) calling A::A(int)\n&quot;, 0 ) ) { cout &lt;&lt; &quot;body of B::B(int)\n&quot;; }<br />
};</p>
</blockquote>
<p>Was zum?! Trickst du beim ersten cout mit dem Komma-Operator herum oder wie?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357396</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 02 Sep 2007 17:16:31 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung bei virtueller Basisklasse on Sun, 02 Sep 2007 17:27:30 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>struct B : virtual A<br />
{<br />
B(int = 0) : A( ( cout &lt;&lt; &quot;B::B(int) calling A::A(int)\n&quot;, 0 ) ) { cout &lt;&lt; &quot;body of B::B(int)\n&quot;; }<br />
};</p>
</blockquote>
<p>Was zum?! Trickst du beim ersten cout mit dem Komma-Operator herum oder wie?</p>
</blockquote>
<p>genau. Es ging mir darum zu demonstrieren, welcher Konstruktor welchen aufruft. Das sollte kein Vorschlag sein, wie Code im Allgemeinen zu schreiben ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357406</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 02 Sep 2007 17:27:30 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung bei virtueller Basisklasse on Sun, 02 Sep 2007 17:45:16 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>genau. Es ging mir darum zu demonstrieren, welcher Konstruktor welchen aufruft. Das sollte kein Vorschlag sein, wie Code im Allgemeinen zu schreiben ist.</p>
</blockquote>
<p>Ok, ich hatte mich nur ziemlich gewundert, das sah so ungewohnt aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357416</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 02 Sep 2007 17:45:16 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung bei virtueller Basisklasse on Mon, 03 Sep 2007 09:22:47 GMT]]></title><description><![CDATA[<p>Also, erstmal danke für eure Antworten, besonders für das umfangreiche Codebeispiel.</p>
<p>Jetzt kommt der Teil mit der Fragerei: <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="😃"
    /><br />
Meine beiden Fragen lassen sich also mit Ja beantworten, oder? Nur das vollständige Objekt darf die Basisklasse initialisieren und es kann auch implizit virtual weitervererbt werden.</p>
<p>Was ich nicht verstanden habe:<br />
1. die Funktion des Kommaoperators, der Null und des inneren Klammernpaars<br />
2. den Parameter &quot;int = 0&quot; der Konstruktoren<br />
3. die Bedeutung von &quot;qualifizieren&quot; (Bevorzugung von B::A(...), um Namenskonflikte beim Mehrfacherben von einem virtual und einem nicht-virtual Zweig zu vermeiden?)</p>
<p>Danke für eure Geduld <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357674</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Mon, 03 Sep 2007 09:22:47 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung bei virtueller Basisklasse on Mon, 03 Sep 2007 09:29:37 GMT]]></title><description><![CDATA[<p>moagnus schrieb:</p>
<blockquote>
<p>1. die Funktion des Kommaoperators, der Null und des inneren Klammernpaars (Übergabe des ausgegebenen Wertes?)</p>
</blockquote>
<p>Der Komma-Operator wertet seine Argumente nacheinander aus und verwirft das Ergebnis des ersten Arguments - den kann man verwenden, wenn man mehrere &quot;Anweisungen&quot; an einer Stelle benötigt, wo nur ein Ausdruck erlaubt ist.<br />
In den Beispielen wird also erst der Text ausgegeben und danach die 0 an den Vater-Ctor übergeben.<br />
(die doppelten Klammern sind nötig, um den Komma-Operator von dem Komma in einer Argumentliste zu unterscheiden - mit einfachen Klammern würde der Compiler einen CTor 'A(ostream&amp;,int)' suchen.</p>
<blockquote>
<p>2. der Parameter &quot;int = 0&quot; der Konstruktoren</p>
</blockquote>
<p>Das nennt sich Default-Parameter - und dürfte hier nötig sein, um den Basis-Ctor'en überhaupt etwas mitgeben zu können.</p>
<blockquote>
<p>3. die Bedeutung von &quot;qualifizieren&quot; (Bevorzugung von B::A(...), um Namenskonflikte beim Mehrfacherben von einem virtual und einem nicht-virtual Zweig zu vermeiden?)</p>
</blockquote>
<p>&quot;qualifizieren&quot; bedeutet, daß du angeben mußt, welches A du verwenden willst. In der Klasse F hast du zwei davon zur Auswahl und mußt deshalb angeben, ob du den Teil aus der B oder aus der E verwenden willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357690</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 03 Sep 2007 09:29:37 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung bei virtueller Basisklasse on Mon, 03 Sep 2007 09:38:27 GMT]]></title><description><![CDATA[<p>moagnus schrieb:</p>
<blockquote>
<p>1. die Funktion des Kommaoperators, der Null und des inneren Klammernpaars</p>
</blockquote>
<p>Der Kommaoperator fuehrt beide Anweisungen aus, das Ergebnis ist das der zweiten Anweisung. Sprich: <code>bla,0</code> fuehrt erst bla aus, dann die 0 (wird nicht wirklich ausgefuehrt) und gibt dann die 0 zurueck. Im obigen Beispiel ist bla eine Ausgabe.</p>
<blockquote>
<p>2. den Parameter &quot;int = 0&quot; der Konstruktoren</p>
</blockquote>
<p>Bedeutet dass die Konstruktoren einen int Parameter uebernehmen koennen, aber nicht muessen (fuers &quot;nicht muessen&quot; der default 0). Der Parameter hat keinen Namen, weil er schlichtweg nicht benutzt wird. ein <code>B(int i = 0)</code> ist vielleicht gelaeufiger.</p>
<blockquote>
<p>3. die Bedeutung von &quot;qualifizieren&quot; (Bevorzugung von B::A(...), um Namenskonflikte beim Mehrfacherben von einem virtual und einem nicht-virtual Zweig zu vermeiden?)</p>
</blockquote>
<p>Jein. Da im Objekt zwei Unterobjekte vom Typ A vorhanden sind, reicht ein einfacher Konstruktoraufruf von A nicht. Qualifizieren bedeutet in diesem Fall, anzugeben, welches A gemeint ist. B::A und C::A ist durchs virtuelle erben das selbe, E::A ist das zweite Vorkommen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357698</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 03 Sep 2007 09:38:27 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung bei virtueller Basisklasse on Mon, 03 Sep 2007 11:30:00 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort.</p>
<p>Zu 1)</p>
<pre><code class="language-cpp">( cout &lt;&lt; &quot;B::B(int) calling A::A(int)\n&quot;, 0 )
</code></pre>
<p>Es wird also eine Stringausgabe ausgeführt, die Null wird &quot;ausgeführt&quot; und dann wird die Null zurückgegeben? Was bedeutet &quot;Null zurückgeben&quot;? Der Compiler behauptet übrigens, dass &quot;cout&quot; in dem Gültigkeitsbereich der Konstruktoren nicht definiert wäre.<br />
Zu 2) Ahja, ok. Der fehlende Variablenname hat mich irritiert. &quot;int i = 0&quot; ist mir bekannt.<br />
Zu 3)</p>
<pre><code class="language-cpp">F(int = 0) : B::A( ( cout &lt;&lt; &quot;F::F(int) calling A::A(int)\n&quot;, 0 ) ),
             B( ( cout &lt;&lt; &quot;F::F(int) calling B::B(int)\n&quot;, 0 ) ),
             C( ( cout &lt;&lt; &quot;F::F(int) calling C::C(int)\n&quot;, 0 ) ),
             E( ( cout &lt;&lt; &quot;F::F(int) calling E::E(int)\n&quot;, 0 ) )
</code></pre>
<p>Also wird hier B::A(...) gewählt?</p>
<p>Und nochwas: Bei Strukturen statt Klassen wird standardmäßig public vererbt, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357785</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Mon, 03 Sep 2007 11:30:00 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung bei virtueller Basisklasse on Mon, 03 Sep 2007 11:51:55 GMT]]></title><description><![CDATA[<p>moagnus schrieb:</p>
<blockquote>
<p>Danke für deine Antwort.</p>
<p>Zu 1)</p>
<pre><code class="language-cpp">( cout &lt;&lt; &quot;B::B(int) calling A::A(int)\n&quot;, 0 )
</code></pre>
<p>Es wird also eine Stringausgabe ausgeführt, die Null wird &quot;ausgeführt&quot; und dann wird die Null zurückgegeben? Was bedeutet &quot;Null zurückgeben&quot;? Der Compiler behauptet übrigens, dass &quot;cout&quot; in dem Gültigkeitsbereich der Konstruktoren nicht definiert wäre.</p>
</blockquote>
<p>&quot;ausgeführt&quot; ist vielleicht der falsche Begriff - &quot;ausgewertet&quot; trifft es besser.</p>
<p>OK, dann zurück zu den Grundlagen: Jeder Ausdruck hat einen Wert, der an der nötigen Stelle berechnet wird, d.h. bevor der Ctor aufgerufen werden kann, wird erstmal sein Parameter berechnet. Und diese Berechnung läuft im Fall des Komma-Operators so ab:</p>
<ul>
<li>berechne den ersten Operanden<br />
(das ist in diesem Fall das 'cout&lt;&lt;&quot;...&quot;, das als Nebeneffekt den Text ausgibt)</li>
<li>berechne den zweiten Operanden<br />
(das ist hier der Ausdruck &quot;0&quot; - mit dem wenig überraschenden Wert 0)</li>
<li>liefere den Wert des zweiten Operanden zurück<br />
(also die &quot;berechnete&quot; 0 - der Wert des ersten Operanden (cout) fällt unter den Tisch)</li>
</ul>
<p>Btw, kannst du die Fehlermeldung mal komplett wiederholen? (möglich, daß du einfach nur das std:: vergessen hast)</p>
<blockquote>
<p>Und nochwas: Bei Strukturen statt Klassen wird standardmäßig public vererbt, oder?</p>
</blockquote>
<p>Ja, wird es.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357808</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 03 Sep 2007 11:51:55 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung bei virtueller Basisklasse on Mon, 03 Sep 2007 12:10:33 GMT]]></title><description><![CDATA[<p>Ok, jetzt hab ichs kapiert.<br />
Hm, ich red von deinem Code...</p>
<blockquote>
<p>test2.cpp:1: Fehler: expected constructor, destructor, or type conversion before »&lt;« token<br />
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/i486-linux-gnu/bits/c++config.h:47: Fehler: »__gnu_debug_def« ist kein Namensbereichs-Name<br />
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/i486-linux-gnu/bits/c++config.h:47: Fehler: expected namespace-name before »;« token<br />
test2.cpp: In constructor »A::A(int)«:<br />
test2.cpp:7: Fehler: »cout« wurde in diesem Gültigkeitsbereich nicht definiert<br />
test2.cpp: In constructor »B::B(int)«:<br />
test2.cpp:12: Fehler: »cout« wurde in diesem Gültigkeitsbereich nicht definiert<br />
test2.cpp: In constructor »C::C(int)«:<br />
test2.cpp:17: Fehler: »cout« wurde in diesem Gültigkeitsbereich nicht definiert<br />
test2.cpp: In constructor »D::D(int)«:<br />
test2.cpp:22: Fehler: »cout« wurde in diesem Gültigkeitsbereich nicht definiert<br />
test2.cpp: In constructor »E::E(int)«:<br />
test2.cpp:30: Fehler: »cout« wurde in diesem Gültigkeitsbereich nicht definiert<br />
test2.cpp: In constructor »F::F(int)«:<br />
test2.cpp:39: Fehler: »cout« wurde in diesem Gültigkeitsbereich nicht definiert<br />
test2.cpp: In function »int main()«:<br />
test2.cpp:48: Fehler: »cout« wurde in diesem Gültigkeitsbereich nicht definiert</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1357827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357827</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Mon, 03 Sep 2007 12:10:33 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung bei virtueller Basisklasse on Mon, 03 Sep 2007 12:10:47 GMT]]></title><description><![CDATA[<p>Dann schau dir doch mal die erste Zeile der Fehlermeldung an. Offenbar hast du den Compiler schon in der ersten Zeile von test2.cpp verwirrt, dann passierts oft, dass er in den folgenden Zeilen nur noch mehr verwirrt wird, obwohl da nichts dran suzusetzen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357832</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 03 Sep 2007 12:10:47 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung bei virtueller Basisklasse on Mon, 03 Sep 2007 12:22:49 GMT]]></title><description><![CDATA[<p>Also ich würde mal spontan vermuten, du hast das # von '#include&lt;iostream&gt; vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357844</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 03 Sep 2007 12:22:49 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung bei virtueller Basisklasse on Mon, 03 Sep 2007 12:30:10 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Hätte die Nacht nicht durchmachen sollen (Ausrede)...<br />
Funktioniert natürlich wunderbar</p>
<p>Danke nochmals an alle. Hab gut was dazugelernt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357850</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Mon, 03 Sep 2007 12:30:10 GMT</pubDate></item></channel></rss>