<?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[Konstruktor und Virtuelle Methoden]]></title><description><![CDATA[<p>Hallo an alle c++-Freunde.<br />
Bin neu hier im Forum und habe gleich ein paar Fragen auf die ich eine Antwort hier im Forum suche.<br />
Folgender Bsp.Code:</p>
<pre><code class="language-cpp">class Dreieck : public Figur
{
   protected:
   float g, h;
   public:
   Dreieck(){}
   Dreieck(float grundseite, float hoehe) : g(grundseite), h(hoehe) {}
   virtual void Daten();
   virtual void Flaeche();
};

class gleichseitigesDreieck : public Dreieck
{
   float a;
   public:
   gleichseitigesDreieck(float seite) : a(seite) {}
   void Daten();
   void Flaeche();
};
</code></pre>
<p>Nun die Fragen:<br />
1. Wieso wird unbedingt der Default Konstruktor in der Klasse Dreieck benötigt?<br />
Bei weglassen gibt es compilerfehler.<br />
Wenn ich jedoch den Default Konstruktor in der Klasse Dreieck lasse, dann kann ich auch nicht initialisierte Objekte vom Typ Dreieck erstellen, dass will ich aber unterbinden, deswegen der zweite Konstruktor. Ist es anderweitig möglich das Problem zu umgehen?<br />
2. Die Klasse Figur ist eine Abstrakte Klasse mit den beiden Virtuellen Methoden Flaeche() und Daten(), macht es Sinn die beiden Methoden in der Basisklasse Dreieck auch virtuell anzulegen? Wenn ja welche Vor/Nachteile hat man dann davon.</p>
<p>MfG<br />
Dima</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/204047/konstruktor-und-virtuelle-methoden</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 08:53:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/204047.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 Jan 2008 16:41:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 16:41:57 GMT]]></title><description><![CDATA[<p>Hallo an alle c++-Freunde.<br />
Bin neu hier im Forum und habe gleich ein paar Fragen auf die ich eine Antwort hier im Forum suche.<br />
Folgender Bsp.Code:</p>
<pre><code class="language-cpp">class Dreieck : public Figur
{
   protected:
   float g, h;
   public:
   Dreieck(){}
   Dreieck(float grundseite, float hoehe) : g(grundseite), h(hoehe) {}
   virtual void Daten();
   virtual void Flaeche();
};

class gleichseitigesDreieck : public Dreieck
{
   float a;
   public:
   gleichseitigesDreieck(float seite) : a(seite) {}
   void Daten();
   void Flaeche();
};
</code></pre>
<p>Nun die Fragen:<br />
1. Wieso wird unbedingt der Default Konstruktor in der Klasse Dreieck benötigt?<br />
Bei weglassen gibt es compilerfehler.<br />
Wenn ich jedoch den Default Konstruktor in der Klasse Dreieck lasse, dann kann ich auch nicht initialisierte Objekte vom Typ Dreieck erstellen, dass will ich aber unterbinden, deswegen der zweite Konstruktor. Ist es anderweitig möglich das Problem zu umgehen?<br />
2. Die Klasse Figur ist eine Abstrakte Klasse mit den beiden Virtuellen Methoden Flaeche() und Daten(), macht es Sinn die beiden Methoden in der Basisklasse Dreieck auch virtuell anzulegen? Wenn ja welche Vor/Nachteile hat man dann davon.</p>
<p>MfG<br />
Dima</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445783</guid><dc:creator><![CDATA[Dima]]></dc:creator><pubDate>Tue, 29 Jan 2008 16:41:57 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 16:57:20 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>1. Der Standardkonstruktor wird normalerweise nicht benötigt. Wenn bei dir Fehlermeldungen kommen dann liegt das an der Anwendung der Klasse die den Standardkonstruktor erfordert, zum Beispiel <em>std::vector&lt;Dreieck&gt;</em>. Da vector eventuell gezwungen ist die Instanzen zu kopieren braucht deine Klasse entweder einen Standardkonstruktor oder einen Kopierkonstruktor. Mit letzterem kannst du das Problem der nicht initialisierten Instanzen umgehen.</p>
<p>2. Es macht keinen Unterschied. Du kannst in Dreieck das virtual weglassen.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445801</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 29 Jan 2008 16:57:20 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 17:00:44 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<ol>
<li></li>
</ol>
<p>Der Standardkonstruktor wird bei beim Konstruktor von gleichseitigesDreieck aufgerufen und deshalb benötigt. Wenn du hier den anderen Konstruktor von Dreieck aufrufst brauchst du ihn nicht mehr.<br />
etwa so.</p>
<pre><code class="language-cpp">class gleichseitigesDreieck : public Dreieck
{
   float a;
   public:
   gleichseitigesDreieck(float seite) : Dreieck(seite, seite/2.0*sqrt(3.0)), a(seite) {}
   void Daten();
   void Flaeche();
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1445805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445805</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 29 Jan 2008 17:00:44 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 17:02:36 GMT]]></title><description><![CDATA[<p>Dima schrieb:</p>
<blockquote>
<p>1. Wieso wird unbedingt der Default Konstruktor in der Klasse Dreieck benötigt?<br />
Bei weglassen gibt es compilerfehler.</p>
</blockquote>
<p>1. Weil &quot;gleichseitigesDreieck&quot; keinen anderen in der Initialisierungsliste aufruft.</p>
<pre><code class="language-cpp">gleichseitigesDreieck(float seite)
: Dreieck(xxx, yyy), // &lt;-- xxx,yyy entsprechend austauschen
  a(seite)
{}
</code></pre>
<p>2. Man schreibt man auch den Fehler dazu, die funktionierenden Glaskugeln sind leider Mangelware.<br />
3. gleichseitigesDreieck ist eh ein Designfehler. es währe besser der Klasse Dreieck eine Methode alle isGleichseitig zu verpassen. Den nach dem Design ist ein gleichseitigesDreieck zwar ein Dreieck, aber ein Dreieck niemals gleichseitig.</p>
<p>Dima schrieb:</p>
<blockquote>
<p>Die Klasse Figur ist eine Abstrakte Klasse mit den beiden Virtuellen Methoden Flaeche() und Daten(), macht es Sinn die beiden Methoden in der Basisklasse Dreieck auch virtuell anzulegen? Wenn ja welche Vor/Nachteile hat man dann davon.</p>
</blockquote>
<p>Es macht keinen Unterschied da &quot;virtual&quot; quasi mitvererbt wird.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445806</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 29 Jan 2008 17:02:36 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 17:11:41 GMT]]></title><description><![CDATA[<p>Ok, habe vergessen zu erläutern, dass das Problem in der folgenden Zeile liegt.<br />
Es spielt im Moment keine Rolle, wie die klasse verwendet wird.</p>
<pre><code class="language-cpp">gleichseitigesDreieck(float seite) : a(seite) {}
</code></pre>
<p>ich möchte bloß, dass in der klasse Dreieck das Objekt mit zwei variablen instantiiert wird und in der klasse gleichseitigesDreieck nur mit einer Variable.<br />
Beim weglassen des Standardkonstruktors in der basisklasse bringt mir der compiler einen fehler, dass er den zugehörigen konstruktor in der Basisklasse nicht findet.<br />
Ich muss entweder den Standardkonstruktor oder ich einen neuen anlegen, der mir die variablen der Basisklasse benutzt:</p>
<pre><code class="language-cpp">Dreieck(float grundseite) : g(grundseite) {}
</code></pre>
<p>Dann habe ich das Problem, dass beim erstellen von Objekten der Klasse Dreieck so etwas zulässig ist:<br />
[cpp]<br />
Dreieck dreieck1(); //soll nicht sein<br />
Dreieck dreieck2(1); //soll auch nicht sein<br />
gleichseitigesDreieck dreieck3(2); //ok<br />
Dreieck dreieck4(2,3); //ok</p>
<p>MfG<br />
Dima</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445814</guid><dc:creator><![CDATA[Dima]]></dc:creator><pubDate>Tue, 29 Jan 2008 17:11:41 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 17:21:49 GMT]]></title><description><![CDATA[<p>Warum machst dus dann nicht einfach so wie ich dir das gezeigt habe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445824</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 29 Jan 2008 17:21:49 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 17:27:45 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Warum machst dus dann nicht einfach so wie ich dir das gezeigt habe?</p>
</blockquote>
<p>Sorry, habe ein wenig länger gebraucht um den Beitrag zu Verfassen. Danke für euere unterstützung.<br />
Bin nicht so flink mit den Fingern. <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>
<p>d.h. Nur fürs verständnis. Man braucht, wenn Variablen in der unterklasse initialisiert werden, einen passenden kostruktor in der Basisklasse???</p>
<p>2. Habt ihr etwas mehr info material Links,etc. für das stichwort virtuell? raff es einfach nicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445825</guid><dc:creator><![CDATA[Dima]]></dc:creator><pubDate>Tue, 29 Jan 2008 17:27:45 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 17:35:47 GMT]]></title><description><![CDATA[<p>Das ist komisch formuliert und trifft es irgendwie immer. Natürlich braucht die Basisklasse den Konstruktor, den Du in der Unterklasse aufrufst. Der springende Punkt ist, du musst im Konstruktor jeder abgeleiteten Klasse (irgend)einen Konstruktor der Basisklasse explizit aufrufen, wenn die Basisklasse <strong>keinen</strong> Default-Konstruktor (den ohne Parameter) hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445829</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 29 Jan 2008 17:35:47 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 17:36:21 GMT]]></title><description><![CDATA[<p>zu virtual<br />
<a href="http://tutorial.schornboeck.net/virtual.htm" rel="nofollow">http://tutorial.schornboeck.net/virtual.htm</a><br />
<a href="http://www.ica1.uni-stuttgart.de/Courses_and_Lectures/C++/script/node18.html#SECTION00422000000000000000" rel="nofollow">http://www.ica1.uni-stuttgart.de/Courses_and_Lectures/C++/script/node18.html#SECTION00422000000000000000</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445830</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 29 Jan 2008 17:36:21 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 17:47:01 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Das ist komisch formuliert und trifft es irgendwie immer. Natürlich braucht die Basisklasse den Konstruktor, den Du in der Unterklasse aufrufst.Der springende Punkt ist, du musst im Konstruktor jeder abgeleiteten Klasse (irgend)einen Konstruktor der Basisklasse explizit aufrufen, wenn die Basisklasse <strong>keinen</strong> Default-Konstruktor (den ohne Parameter) hat.</p>
</blockquote>
<p>Jetzt fehlt mir zum verständnis das warum?. Wieso muss ich den explizit einen konstruktor in der Basisklasse aufrufen? Ich habe ja einen Konstruktor in der abgeleiteten Klasse erstellt und möchte nur die Variablen der abgeleiteten klasse initialisieren. Um die Vererbten Variablen zu initialisieren würde es mir einleuchten, dass man den konstruktor der Basisklasse benötigt, aber warum auch für die Variableninitialisierung nur in der abgeleiteten klasse? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Braunstein schrieb:</p>
<blockquote>
<p>zu virtual<br />
<a href="http://tutorial.schornboeck.net/virtual.htm" rel="nofollow">http://tutorial.schornboeck.net/virtual.htm</a><br />
<a href="http://www.ica1.uni-stuttgart.de/Courses_and_Lectures/C++/script/node18.html#SECTION00422000000000000000" rel="nofollow">http://www.ica1.uni-stuttgart.de/Courses_and_Lectures/C++/script/node18.html#SECTION00422000000000000000</a></p>
</blockquote>
<p>Danke für die links werde sie mir gleich duch den Schädel ziehen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445836</guid><dc:creator><![CDATA[Dima]]></dc:creator><pubDate>Tue, 29 Jan 2008 17:47:01 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 17:48:56 GMT]]></title><description><![CDATA[<p>Dima schrieb:</p>
<blockquote>
<p>Jetzt fehlt mir zum verständnis das warum?. Wieso muss ich den explizit einen konstruktor in der Basisklasse aufrufen? Ich habe ja einen Konstruktor in der abgeleiteten Klasse erstellt und möchte nur die Variablen der abgeleiteten klasse initialisieren. Um die Vererbten Variablen zu initialisieren würde es mir einleuchten, dass man den konstruktor der Basisklasse benötigt, aber warum auch für die Variableninitialisierung nur in der abgeleiteten klasse? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Die Basisklasse ist doch immer Teil der abgeleiteten, so musst Du den Basisklassenanteil auch immer konstruieren (lassen). Und das macht nunmal der Konstruktor der Basisklasse. Du kommst in der abgeleiteten ja auch garnicht an die private-Member der Basisklasse ran.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445839</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 29 Jan 2008 17:48:56 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 17:59:28 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Die Basisklasse ist doch immer Teil der abgeleiteten, so musst Du den Basisklassenanteil auch immer konstruieren (lassen). Und das macht nunmal der Konstruktor der Basisklasse.</p>
</blockquote>
<p>Das ergibt Sinn. Danke.</p>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>Du kommst in der abgeleiteten ja auch garnicht an die private-Member der Basisklasse ran.</p>
</blockquote>
<p>Ja schon, aber an die protected.</p>
<p>MfG<br />
Dima</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445845</guid><dc:creator><![CDATA[Dima]]></dc:creator><pubDate>Tue, 29 Jan 2008 17:59:28 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 18:01:42 GMT]]></title><description><![CDATA[<p>Dima schrieb:</p>
<blockquote>
<p>Jetzt fehlt mir zum verständnis das warum?. Wieso muss ich den explizit einen konstruktor in der Basisklasse aufrufen? Ich habe ja einen Konstruktor in der abgeleiteten Klasse erstellt und möchte nur die Variablen der abgeleiteten klasse initialisieren. Um die Vererbten Variablen zu initialisieren würde es mir einleuchten, dass man den konstruktor der Basisklasse benötigt, aber warum auch für die Variableninitialisierung nur in der abgeleiteten klasse?</p>
</blockquote>
<p>Weil ein Konstruktor immer alle nichtstatischen Member (und dazu zählen mögliche Basisklasse) initialisiert, wenn diese keine PODs sind. PODs werden nur initialisiert, wenn sie explizit in der Initialisierungsliste auftauchen.</p>
<p>Deine Verwirrung ist nicht ganz unberechtigt, allerdings liegt das Problem an anderer Stelle. Ein (Objekt des Typs) gleichseitigesDreieck ist kein Dreieck. Generell (99:1) ist es ein Fehler, von konkreten Klassen (solche, die selbst vollständige Objekte erstellen) öffentlich abzuleiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445847</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 29 Jan 2008 18:01:42 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 18:06:22 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<pre><code class="language-cpp">gleichseitigesDreieck(float seite)
: Dreieck(xxx, yyy), // &lt;-- xxx,yyy entsprechend austauschen
  a(seite)
{}
</code></pre>
</blockquote>
<p>Das sieht irgenwie getrickst aus. Gibt es keine andere möglichkeit?<br />
Den das Dreieck(x, y) benötig man ja gar net. Denn die Variablen von Dreieck will ich nicht benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445852</guid><dc:creator><![CDATA[Dima]]></dc:creator><pubDate>Tue, 29 Jan 2008 18:06:22 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 18:10:56 GMT]]></title><description><![CDATA[<p>Da sind sie deswegen trotzdem. Genau sowas verrät dir meist einen Designfehler.<br />
Du könntest gleichseitigesDreieck ja auch von Figur ableiten. Dann hast du das Problem nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445854</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 29 Jan 2008 18:10:56 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 18:13:15 GMT]]></title><description><![CDATA[<p>Gegenwärtig hast du:</p>
<pre><code>Figur
           |
        Dreieck
           |
gleichseitigesDreieck
</code></pre>
<p>besser ist:</p>
<pre><code>Figur
           |
     AbstractDreieck
      /         \
Dreieck      gleichseitigesDreieck
</code></pre>
<p>AbstractDreieck stellt dabei nur das gemeinsame Interface dar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445856</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 29 Jan 2008 18:13:15 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 18:16:07 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Weil ein Konstruktor immer alle nichtstatischen Member (und dazu zählen mögliche Basisklasse) initialisiert, wenn diese keine PODs sind. PODs werden nur initialisiert, wenn sie explizit in der Initialisierungsliste auftauchen.</p>
<p>Deine Verwirrung ist nicht ganz unberechtigt, allerdings liegt das Problem an anderer Stelle. Ein (Objekt des Typs) gleichseitigesDreieck ist kein Dreieck. Generell (99:1) ist es ein Fehler, von konkreten Klassen (solche, die selbst vollständige Objekte erstellen) öffentlich abzuleiten.</p>
</blockquote>
<p>Ja ein design fehler ist es alle mal, aber die Aufgabenstellung verlangt es nunmal das man von einem Rechteck ein Quadrat ableiten soll. Oder von Dreieck einen Gleichseitigen und Gleichschenkligen ableiten müsse. Deswegen kommen mir auch solche Fragen hoch. Aber immer positiv sehen aus fehlern anderer lern man auch. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1445858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445858</guid><dc:creator><![CDATA[Dima]]></dc:creator><pubDate>Tue, 29 Jan 2008 18:16:07 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 18:19:17 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Weil ein Konstruktor immer alle nichtstatischen Member (und dazu zählen mögliche Basisklasse) initialisiert, wenn diese keine PODs sind. PODs werden nur initialisiert, wenn sie explizit in der Initialisierungsliste auftauchen.</p>
</blockquote>
<p>Sorry POD ???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445860</guid><dc:creator><![CDATA[Dima]]></dc:creator><pubDate>Tue, 29 Jan 2008 18:19:17 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 18:29:40 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>...PODs werden nur initialisiert, wenn sie explizit in der Initialisierungsliste auftauchen....</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Echt ?</p>
<pre><code class="language-cpp">struct A {
   int a, b;
   A() : a(1), b(2) {}
};

struct B : A {
};

int main() {
   B b;
</code></pre>
<p>Wird hier nicht A::A() aufgerufen ?<br />
Oder ist A kein POD ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445868</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 29 Jan 2008 18:29:40 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 18:33:27 GMT]]></title><description><![CDATA[<p>Du wartest jetzt zwar sicher auf camper, <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="🙂"
    /> aber:<br />
Eine struct mit Konstruktor ist kein POD mehr<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18896">@Dima</a><br />
POD (Plain old data).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445871</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 29 Jan 2008 18:33:27 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 18:40:04 GMT]]></title><description><![CDATA[<p>Dima schrieb:</p>
<blockquote>
<p>Das sieht irgenwie getrickst aus. Gibt es keine andere möglichkeit?<br />
Den das Dreieck(x, y) benötig man ja gar net. Denn die Variablen von Dreieck will ich nicht benutzen.</p>
</blockquote>
<p>Du hast hierbei ein Deckproblem, hierzu rollen wir mal alles auf (Nur bezogen auf den Regelfall, nicht auf solche Spezialitäten wir private Ableitungen...):</p>
<p>Ja, umgangssprachlich kann man sagen das ein gleichseitigesDreieck ein Dreieck ist. Vererbung setzt man ein um Anzuzeigen, das es sich um ein spezialisiertere Form handelt, nicht aber für Einschränkungen. Alles was die Basisklasse als Schnittstelle unterstützt muss auch die abgeleitete Klasse unterstüzen. Die abgeleitete Klasse &quot;ist ein&quot; auch ein Element der Basisklasse.</p>
<p>Einschränkungen stellt man besser durch Eigenschaften dar, als durch Ableitungen. Ich schätze mal du wirst es an einen extremen Beispiel verstehen:</p>
<pre><code class="language-cpp">class Dreieck;
class BlauesDreieck : public Dreieck;
</code></pre>
<p>Ich hoffe mal dir leuchtet ein, das sowas nicht sinnvoll ist.</p>
<p>So, da eine Abgeleitete Klasse nun alles was die Basisklassen repräsentieren auch darstellt, muss es auch alles initialisieren was dazu gehört. Dazu müssen passende Konstruktoren der Basisklasse aufgerufen werden. Falls es kein Standardkonstruktor gibt, musst du einen spezialisierten in der Initialisieungsliste aufrufen.</p>
<p>Was aber grundsätzlich geht: Du kannst einen Konstruktor auch protected deklarieren, so das er von Außerhalb nicht zugreifbar ist. Aber auch das verbessert kein schlechtes Design.</p>
<p>Und zu guter letzt: Vererbung lässt sich auch durch Komposition ersetzen. Bei Komposition enthält deine Klasse eine andere, gibt aber nur seine Schnittstelle frei. Du könntest z.B. sagen du schreibst eine Klasse gleichseitigesDreieck, da aber die Regeln für ein Dreieck nicht vollständig zutreffen leitest du nicht ab, sondern schreibst eine passende Schnittstelle. Bei der Implementierung kannst du aber auf das Dreieck zurückgreifen, und nimmst daher ein Dreieck als Member.</p>
<p>Noch immer kein wirklich gutes Design, aber besser als die Vererbung.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445874</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 29 Jan 2008 18:40:04 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 18:42:29 GMT]]></title><description><![CDATA[<p>Dima schrieb:</p>
<blockquote>
<p>Ja ein design fehler ist es alle mal, aber die Aufgabenstellung verlangt es nunmal das man von einem Rechteck ein Quadrat ableiten soll. Oder von Dreieck einen Gleichseitigen und Gleichschenkligen ableiten müsse. Deswegen kommen mir auch solche Fragen hoch. Aber immer positiv sehen aus fehlern anderer lern man auch. <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>
</blockquote>
<p>Vermutlich kommt die &quot;Auflösung&quot; nach der Aufgabenstellung, mit einer Erklärung warum es schlechtes Design ist ;p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445879</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 29 Jan 2008 18:42:29 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 18:50:49 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Ableitungen. Ich schätze mal du wirst es an einen extremen Beispiel verstehen:</p>
<pre><code class="language-cpp">class Dreieck;
class BlauesDreieck : public Dreieck;
</code></pre>
<p>Ich hoffe mal dir leuchtet ein, das sowas nicht sinnvoll ist.</p>
</blockquote>
<p>Nee, das leutet mir jetzt nicht ein.<br />
Ein BlauesDreieck kann ja im prinzip alles von der Basisklasse erben immerhin ist es ja ein dreieck, bloß das es blau ist. Also eine Eigenschaft z.B. Farbe mehr hat. also könnte man doch die Eigenschaften und Methoden von dem Dreieck erben? Oder nicht?</p>
<p>Und zu guter letzt: Vererbung lässt sich auch durch Komposition ersetzen. Bei Komposition enthält deine Klasse eine andere, gibt aber nur seine Schnittstelle frei. Du könntest z.B. sagen du schreibst eine Klasse gleichseitigesDreieck, da aber die Regeln für ein Dreieck nicht vollständig zutreffen leitest du nicht ab, sondern schreibst eine passende Schnittstelle. Bei der Implementierung kannst du aber auf das Dreieck zurückgreifen, und nimmst daher ein Dreieck als Member.</p>
<p>Noch immer kein wirklich gutes Design, aber besser als die Vererbung.<br />
[/quote]<br />
Wie sieht den so eine komposition aus?<br />
evtl. C++ Code? Bin eher praktisch orientiert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445892</guid><dc:creator><![CDATA[Dima]]></dc:creator><pubDate>Tue, 29 Jan 2008 18:50:49 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Tue, 29 Jan 2008 19:03:28 GMT]]></title><description><![CDATA[<p>Dima schrieb:</p>
<blockquote>
<p>Nee, das leutet mir jetzt nicht ein.</p>
</blockquote>
<p>Okay, einleuchten wird es dir spätestens wenn du dies für alle Webfarben einmal machen darfst ;)... Es gibt Dinge die drückt man durch Eigenschaften, nicht vererbung aus. Und ob ein Dreieck nun gleichseitig ist oder nicht, ist eher eine Eigenschaft als eine eigenständige Einheit.</p>
<p>Dima schrieb:</p>
<blockquote>
<p>Wie sieht den so eine komposition aus?<br />
evtl. C++ Code? Bin eher praktisch orientiert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<pre><code class="language-cpp">class gleichseitigesDreieck
{
  private:
    Dreieck dreieck;
    //...
  public:
  //...
};
</code></pre>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445910</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 29 Jan 2008 19:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Wed, 30 Jan 2008 08:49:19 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>...<br />
Eine struct mit Konstruktor ist kein POD mehr<br />
...</p>
</blockquote>
<p>Aha !! Ich dachte es würde ein trivialer Destruktor reichen. Danke - man lernt nie aus.</p>
<p>Braunstein schrieb:</p>
<blockquote>
<p>Du wartest jetzt zwar sicher auf camper, <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>
</blockquote>
<p>Ach neee, Dir glaube ich auch (fast) alles <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>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1446118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1446118</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 30 Jan 2008 08:49:19 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor und Virtuelle Methoden on Wed, 30 Jan 2008 11:32:10 GMT]]></title><description><![CDATA[<p>FAQ, ganz Oben. Ist bewusst kurz gehalten, um das Nachschlagen zu erleichtern, als Einführung ist es viel zu knapp.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1446211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1446211</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 30 Jan 2008 11:32:10 GMT</pubDate></item></channel></rss>