<?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[Virtuelle Basisklasse]]></title><description><![CDATA[<p>Hallo,<br />
in meinem C++ Buch steht folgendes Beispiel:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;

class Basis {
    public:
   Basis() { std::cout &lt;&lt; &quot;Basis-Standard-Konstruktor\n&quot;; }
        Basis(const char* a)  { std::cout &lt;&lt; a &lt;&lt; std::endl; }
        virtual ~Basis(){}  // virtueller Destruktor
};

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

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),             // siehe Text
         Links(a), Rechts(a)  {}
};

int main() {
    Unten x(&quot;Unten&quot;);
    Links li(&quot;Links&quot;);
}
</code></pre>
<p>Und der Text dazu:<br />
&quot;Es gibt zweimal Basis-Standardkonsruktor aus. Der Basisklasseninitialisierer basis(a) in der Klasse Rechts wird vom Konstruktor von Unten ignoriert!. Stattsessen wird nur der beim Konstruktor von Unten direkt angegebene Basisklassenkonstrktor berücksichtigt. Da er hie auskommentiert ist, wird der Standardkonstruktor von basis genommen. Wenn jedoch die Komentarzeichen // aus der Initialisierungsliste entfernt werden, ist die Ausgabe:<br />
Unten<br />
Links&quot;</p>
<p>Irgendwie verstehe ich das nicht so recht.</p>
<p>Also mit Kommentrarzeichen. Es soll ein Objekt Unten konstruiert werden. Die Initialisierungsliste ruft die Konstruktoren von rechts und links auf. Aber wieso wird die Initialisierungsliste hier ignoriert?<br />
Und ohne Kommentarzeichen verstehe ich leider noch weniger. Kann mir das bitte noch mal jemand verständlich erklären?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263096/virtuelle-basisklasse</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 01:28:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263096.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 15 Mar 2010 21:15:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Virtuelle Basisklasse on Mon, 15 Mar 2010 21:15:54 GMT]]></title><description><![CDATA[<p>Hallo,<br />
in meinem C++ Buch steht folgendes Beispiel:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;

class Basis {
    public:
   Basis() { std::cout &lt;&lt; &quot;Basis-Standard-Konstruktor\n&quot;; }
        Basis(const char* a)  { std::cout &lt;&lt; a &lt;&lt; std::endl; }
        virtual ~Basis(){}  // virtueller Destruktor
};

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

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),             // siehe Text
         Links(a), Rechts(a)  {}
};

int main() {
    Unten x(&quot;Unten&quot;);
    Links li(&quot;Links&quot;);
}
</code></pre>
<p>Und der Text dazu:<br />
&quot;Es gibt zweimal Basis-Standardkonsruktor aus. Der Basisklasseninitialisierer basis(a) in der Klasse Rechts wird vom Konstruktor von Unten ignoriert!. Stattsessen wird nur der beim Konstruktor von Unten direkt angegebene Basisklassenkonstrktor berücksichtigt. Da er hie auskommentiert ist, wird der Standardkonstruktor von basis genommen. Wenn jedoch die Komentarzeichen // aus der Initialisierungsliste entfernt werden, ist die Ausgabe:<br />
Unten<br />
Links&quot;</p>
<p>Irgendwie verstehe ich das nicht so recht.</p>
<p>Also mit Kommentrarzeichen. Es soll ein Objekt Unten konstruiert werden. Die Initialisierungsliste ruft die Konstruktoren von rechts und links auf. Aber wieso wird die Initialisierungsliste hier ignoriert?<br />
Und ohne Kommentarzeichen verstehe ich leider noch weniger. Kann mir das bitte noch mal jemand verständlich erklären?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869554</guid><dc:creator><![CDATA[Der Anfänger!]]></dc:creator><pubDate>Mon, 15 Mar 2010 21:15:54 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Basisklasse on Mon, 15 Mar 2010 22:28:45 GMT]]></title><description><![CDATA[<p>Das Beispiel soll zeigen, dass der Konstruktor von Basis nicht mehr indirekt durch<br />
die Links - und Rechtskonstruktoren aufgerufen wird,<br />
sondern expliziet im Unten-Konstruktor angegeben werden muss.<br />
Warum?<br />
Weil virtuelles ableiten ja hier heisst, dass Unten nur <strong>ein</strong> Teilobjekt von Basis enthält.<br />
Wenn jetzt aber der Basis-Konstruktor z.B. ein Member-String setzen würde und<br />
Links Basis('Links') und Rechts Basis('Rechts') aufrufen wüde,<br />
welchen Wert sollte die Member-Variable dann annehmen?</p>
<p>Hoffe das hilft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869584</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Mon, 15 Mar 2010 22:28:45 GMT</pubDate></item></channel></rss>