<?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[Nochmal Vererbung]]></title><description><![CDATA[<p>Da ich noch immer einige Probleme damit habe:</p>
<p>Ich habe Klasse Basis und Derived,<br />
ich möchte dass immer wenn ein von Basis abgeleitetes Objekt erstellt wird, ein Counter erhöht wird:</p>
<pre><code class="language-cpp">class Basis
{
public:
    static int COUNTER;
    int id;
    Basis(): id(COUNTER){ Basis::COUNTER ++};
}
</code></pre>
<p>Wenn nun die Klasse Derived einen Konstruktor ohne Argumente erhält, was passiert?</p>
<pre><code class="language-cpp">class Derived: public Basis
{
    Derived(){};
}
</code></pre>
<p>wird dann bei der erstellung eines derived der Konstruktor von Basis aufgerufen, weil die Argumente übereinstimmen (Konstruktoren werden doch eigentlich nicht mitvererbt) ?</p>
<p>Falls das der Fall ist, was würde bei &quot;widersprüchlichen&quot; Konstruktoren der Fall sein?</p>
<pre><code class="language-cpp">class Derived : public Basis
{
    Derived(): id(42){};
}
</code></pre>
<p>Würde dann der &quot;alte&quot; Konstruktor überdeckt?</p>
<p>Annahme Basis würde so aussehen:</p>
<pre><code class="language-cpp">class Basis
{
    int id;
    Basis(int x): id(x);
}
</code></pre>
<p>Könnte eine Klasse Derived die so aussieht:</p>
<pre><code class="language-cpp">class Derived: public Basis
{
}
</code></pre>
<p>überhaupt erstellt werden? Sie dürfte ja keinen gültigen Konstruktor mehr haben, oder?</p>
<p>So ich hoffe ich habe jetzt alle Fälle abgedeckt^^</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261946/nochmal-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 02:46:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261946.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 25 Feb 2010 22:53:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Nochmal Vererbung on Thu, 25 Feb 2010 22:53:18 GMT]]></title><description><![CDATA[<p>Da ich noch immer einige Probleme damit habe:</p>
<p>Ich habe Klasse Basis und Derived,<br />
ich möchte dass immer wenn ein von Basis abgeleitetes Objekt erstellt wird, ein Counter erhöht wird:</p>
<pre><code class="language-cpp">class Basis
{
public:
    static int COUNTER;
    int id;
    Basis(): id(COUNTER){ Basis::COUNTER ++};
}
</code></pre>
<p>Wenn nun die Klasse Derived einen Konstruktor ohne Argumente erhält, was passiert?</p>
<pre><code class="language-cpp">class Derived: public Basis
{
    Derived(){};
}
</code></pre>
<p>wird dann bei der erstellung eines derived der Konstruktor von Basis aufgerufen, weil die Argumente übereinstimmen (Konstruktoren werden doch eigentlich nicht mitvererbt) ?</p>
<p>Falls das der Fall ist, was würde bei &quot;widersprüchlichen&quot; Konstruktoren der Fall sein?</p>
<pre><code class="language-cpp">class Derived : public Basis
{
    Derived(): id(42){};
}
</code></pre>
<p>Würde dann der &quot;alte&quot; Konstruktor überdeckt?</p>
<p>Annahme Basis würde so aussehen:</p>
<pre><code class="language-cpp">class Basis
{
    int id;
    Basis(int x): id(x);
}
</code></pre>
<p>Könnte eine Klasse Derived die so aussieht:</p>
<pre><code class="language-cpp">class Derived: public Basis
{
}
</code></pre>
<p>überhaupt erstellt werden? Sie dürfte ja keinen gültigen Konstruktor mehr haben, oder?</p>
<p>So ich hoffe ich habe jetzt alle Fälle abgedeckt^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861567</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Thu, 25 Feb 2010 22:53:18 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal Vererbung on Thu, 25 Feb 2010 23:06:27 GMT]]></title><description><![CDATA[<p>shisha schrieb:</p>
<blockquote>
<p>Wenn nun die Klasse Derived einen Konstruktor ohne Argumente erhält, was passiert?<br />
wird dann bei der erstellung eines derived der Konstruktor von Basis aufgerufen, weil die Argumente übereinstimmen (Konstruktoren werden doch eigentlich nicht mitvererbt) ?</p>
</blockquote>
<p>Nein, Konstruktoren werden nicht vererbt. Aber wenn du eine Instanz von Derived erstellst, wird zuerst der Basis-Teil konstruiert und demnach auch dessen Konstruktor aufgerufen. Das ist immer der Standardkonstruktor, es sei denn, du gibst etwas anderes an (siehe unten).</p>
<p>shisha schrieb:</p>
<blockquote>
<p>Falls das der Fall ist, was würde bei &quot;widersprüchlichen&quot; Konstruktoren der Fall sein?<br />
Würde dann der &quot;alte&quot; Konstruktor überdeckt?</p>
</blockquote>
<p>Nö, probier es aus: das kompiliert nicht. Nur die Basisklasse darf id initialisieren, denn wenn der Derivedkonstruktor an die Reihe kommt, müssen alle Elemente von Basis schon fertig konstruiert und initialisiert sein.</p>
<p>shisha schrieb:</p>
<blockquote>
<p>Annahme Basis würde so aussehen:<br />
...<br />
überhaupt erstellt werden? Sie dürfte ja keinen gültigen Konstruktor mehr haben, oder?</p>
</blockquote>
<p>Doch, das geht, indem du explizit angibst, welcher Basisklassenkonstruktor verwendet werden soll:</p>
<pre><code class="language-cpp">class Derived: public Basis
{
  public:
    Derived() : Basis(42) {}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1861571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861571</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Thu, 25 Feb 2010 23:06:27 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal Vererbung on Thu, 25 Feb 2010 23:27:48 GMT]]></title><description><![CDATA[<p>Athar schrieb:</p>
<blockquote>
<p>Nö, probier es aus: das kompiliert nicht. Nur die Basisklasse darf id initialisieren, denn wenn der Derivedkonstruktor an die Reihe kommt, müssen alle Elemente von Basis schon fertig konstruiert und initialisiert sein.</p>
</blockquote>
<p>Was ist nun wenn ich etwas habe wie</p>
<pre><code class="language-cpp">class Basis
{
    int typ;
}
</code></pre>
<p>Jedes von Basis abgeleitete Objekt soll einen Typ haben um Unterklassen zu unterscheiden,<br />
Beispiel Derived1 soll immer typ=1 haben Derived2 immer typ=2 ...<br />
In diesem Fall kann der Typ aber nicht schon im Konstruktor von Basis festgelegt werden, da ja erst die abgeleiteten Klassen ihre Typ-Zahl kennen werden.</p>
<p>Was kann man da tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861578</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Thu, 25 Feb 2010 23:27:48 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal Vererbung on Thu, 25 Feb 2010 23:36:13 GMT]]></title><description><![CDATA[<p>Du kannst im Derivedkonstruktor durchaus typ=1; schreiben, nur darfst du die Initialisierungsliste dafür nicht benutzen.</p>
<p>Eine ganz andere Lösung wäre auch eine virtuelle Methode getType().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861580</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Thu, 25 Feb 2010 23:36:13 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal Vererbung on Thu, 25 Feb 2010 23:43:42 GMT]]></title><description><![CDATA[<p>wo würde man diese Funktion dann sinnvollerweise ausführen?<br />
bzw kannst du das etwas erläutern?</p>
<p>ich möcht auf keinen fall irgendwas wie type(pointer)== type(pointer2)<br />
verwenden müssen^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861582</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Thu, 25 Feb 2010 23:43:42 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal Vererbung on Thu, 25 Feb 2010 23:54:36 GMT]]></title><description><![CDATA[<p>Ich meinte sowas:</p>
<pre><code class="language-cpp">enum EObjectType {OT_UNKNOWN,OT_DERIVED,OT_ANOTHER_DERIVED};

struct Base
{
  virtual EObjectType getType() {return OT_UNKNOWN;}
};

struct Derived : public Base
{
  virtual EObjectType getType() {return OT_DERIVED;}
};

struct AnotherDerived : public Base
{
  virtual EObjectType getType() {return OT_ANOTHER_DERIVED;}
};
</code></pre>
<p>Wenn du jetzt einen Base-Zeiger hast, kannst du einfach durch getType() den eigentlichen Typ erfahren.<br />
So musst du jeweils getType() implementieren, in der anderen Variante musst du stattdessen immer typ im Konstruktor passend setzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861584</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Thu, 25 Feb 2010 23:54:36 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal Vererbung on Fri, 26 Feb 2010 08:02:42 GMT]]></title><description><![CDATA[<p>Athar schrieb:</p>
<blockquote>
<p>Wenn du jetzt einen Base-Zeiger hast, kannst du einfach durch getType() den eigentlichen Typ erfahren.</p>
</blockquote>
<p>Ich sehe keinen Vorteil gegenüber <code>typeid</code> .</p>
<p>Vielleicht sollte shisha mal erklären, was er eigentlich vor hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861612</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 26 Feb 2010 08:02:42 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal Vererbung on Fri, 26 Feb 2010 08:35:21 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Athar schrieb:</p>
<blockquote>
<p>Wenn du jetzt einen Base-Zeiger hast, kannst du einfach durch getType() den eigentlichen Typ erfahren.</p>
</blockquote>
<p>Ich sehe keinen Vorteil gegenüber <code>typeid</code> .</p>
</blockquote>
<p>typeid ist langsam, wenn man den Namen der Klasse braucht, liefert typeid ziemlich unleserliches Zeug (AFAIK ist nicht festgelegt, wie der name() dargestellt werden soll).</p>
<p>Ich würde getType() aber nur virtual machen, wenn das ganze ein Framework wird, welches durch den Nutzer erweitert wird. Wenn nur du der Nutzer bist, kannst du selber dein enum pflegen und in allen abgeleiteten Klassen im Konstruktor den Typ setzen. getType() existiert dann nur in der Basisklasse.</p>
<blockquote>
<p>Vielleicht sollte shisha mal erklären, was er eigentlich vor hat.</p>
</blockquote>
<p>Das wäre wohl tatsächlich das Beste...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861625</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Fri, 26 Feb 2010 08:35:21 GMT</pubDate></item><item><title><![CDATA[Reply to Nochmal Vererbung on Fri, 26 Feb 2010 12:36:15 GMT]]></title><description><![CDATA[<p>Ein <code>getType()</code> ist aber auch doof. Wenn man nur ein <code>enum</code> -Wert zurückgibt, kann man sich die Methode und das <code>enum</code> gerade so gut sparen und auf <code>typeid</code> zurückgreifen. So muss man sich nämlich nicht um die Konsistenz und Erweiterbarkeit kümmern. Wenn hingegen ein String oder andere Zusatzinformationen zurückgegeben werden, die nicht als reine Typ-IDs fungieren, kann man darüber nachdenken.</p>
<p>Aber generell sollte man sich genau überlegen, ob man das gewünschte Verhalten nicht auch mit virtuellen Methoden hinkriegen kann.</p>
<p>l'abra d'or schrieb:</p>
<blockquote>
<p>typeid ist langsam</p>
</blockquote>
<p>Das hängt wohl von der Implementierung ab. Selbst ein langsames <code>typeid</code> wäre für mich nicht gerade das Argument, um auf eine schlechtere Implementierung mit <code>getType()</code> umzusteigen.</p>
<p>l'abra d'or schrieb:</p>
<blockquote>
<p>wenn man den Namen der Klasse braucht, liefert typeid ziemlich unleserliches Zeug (AFAIK ist nicht festgelegt, wie der name() dargestellt werden soll).</p>
</blockquote>
<p>Ja, aber wo ist hier der entscheidende Vorteil von <code>enum</code> ? Damit hast du rein gar keine String-Repräsentation, nicht einmal eine unportable.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861720</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 26 Feb 2010 12:36:15 GMT</pubDate></item></channel></rss>