<?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[Erneute Deklaration in abgeleiteter Klasse]]></title><description><![CDATA[<p>Hallo,</p>
<p>meine C++ Kentnisse sind /etwas/ eingerostet. Trotzdem arbeite ich mich gerade in einen neuen Code ein. Dort ist mir folgendes aufgefallen:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

// HPP-File

class A {
public:
  virtual void init(int i) = 0;
};

class B : public A {
public:
  virtual void init(int i) = 0;
};

class C : public B {
public:
  virtual void init(int i);
};

// CPP-File

void C::init(int i) {
  cout&lt;&lt;&quot;C::A &quot;&lt;&lt;i&lt;&lt;endl;
}
</code></pre>
<p>init() wird also in A rein virtuell deklariert. Warum wird es in B erneut deklariert? Das scheit unnötig zu sein, mein Testcode funtioniert auch so.</p>
<p>Die dritte Deklaration von init() in C ist allerdings notwendig, damit ich es dann in C::init() definieren kann. Stimmt das so? (eigentlich dachte ich zuerst, dass auch die Deklaration von init() in C unnötig ist, sondern einfach überschrieben wird, aber dem ist wohl nicht so).</p>
<p>Vielen Dank &amp; Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326304/erneute-deklaration-in-abgeleiteter-klasse</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 04:24:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326304.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 11 Jun 2014 10:56:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Erneute Deklaration in abgeleiteter Klasse on Wed, 11 Jun 2014 10:56:07 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>meine C++ Kentnisse sind /etwas/ eingerostet. Trotzdem arbeite ich mich gerade in einen neuen Code ein. Dort ist mir folgendes aufgefallen:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

// HPP-File

class A {
public:
  virtual void init(int i) = 0;
};

class B : public A {
public:
  virtual void init(int i) = 0;
};

class C : public B {
public:
  virtual void init(int i);
};

// CPP-File

void C::init(int i) {
  cout&lt;&lt;&quot;C::A &quot;&lt;&lt;i&lt;&lt;endl;
}
</code></pre>
<p>init() wird also in A rein virtuell deklariert. Warum wird es in B erneut deklariert? Das scheit unnötig zu sein, mein Testcode funtioniert auch so.</p>
<p>Die dritte Deklaration von init() in C ist allerdings notwendig, damit ich es dann in C::init() definieren kann. Stimmt das so? (eigentlich dachte ich zuerst, dass auch die Deklaration von init() in C unnötig ist, sondern einfach überschrieben wird, aber dem ist wohl nicht so).</p>
<p>Vielen Dank &amp; Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403437</guid><dc:creator><![CDATA[Horus107]]></dc:creator><pubDate>Wed, 11 Jun 2014 10:56:07 GMT</pubDate></item><item><title><![CDATA[Reply to Erneute Deklaration in abgeleiteter Klasse on Wed, 11 Jun 2014 11:02:47 GMT]]></title><description><![CDATA[<p>Horus107 schrieb:</p>
<blockquote>
<p>Warum wird es in B erneut deklariert?</p>
</blockquote>
<p>Keine Ahnung! Evtl. ist das die einzige nicht definierte Methode in B und deshalb eine Möglichkeit zu zeigen/erkennen, dass B abstrakt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403439</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 11 Jun 2014 11:02:47 GMT</pubDate></item><item><title><![CDATA[Reply to Erneute Deklaration in abgeleiteter Klasse on Wed, 11 Jun 2014 11:06:26 GMT]]></title><description><![CDATA[<p>Die erneute Deklaration in B ist in der Tat unnötig. Man könnte jetzt argumentieren, dass man dadurch dem Leser klar macht, dass es in B noch eine pure virtuelle Methode gibt. Ansonsten wäre B leer und der Leser wüsste nicht, ohne A zu untersuchen, ob es pure virtuelle Methoden gibt. IMO eine Frage des Stils.</p>
<p>Die (erneute) Deklaration in C ist notwendig, damit der Compiler weiß ab wann die Methode nicht mehr pur-virtuell ist! Man kann nämlich auch für die puren virtuellen Methoden eine Definition angeben und diese somit auch in den abgeleiteten Klassen aufrufen. Eine Definition reicht also nicht aus um zu zeigen, dass eine Methode pur oder nicht pur ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403440</guid><dc:creator><![CDATA[Biolunar]]></dc:creator><pubDate>Wed, 11 Jun 2014 11:06:26 GMT</pubDate></item><item><title><![CDATA[Reply to Erneute Deklaration in abgeleiteter Klasse on Wed, 11 Jun 2014 11:15:07 GMT]]></title><description><![CDATA[<p>Horus107 schrieb:</p>
<blockquote>
<p>init() wird also in A rein virtuell deklariert. Warum wird es in B erneut deklariert? Das scheit unnötig zu sein, mein Testcode funtioniert auch so.</p>
</blockquote>
<p>Hast recht, da ist es unnötig.<br />
Ein Kommentar würde auch reichen, wenn man nicht aus versehen vergessen will, daß B abstrakt ist.</p>
<pre><code>class B : public A {
public:
  //virtual void init(int i)=0; in A
};
</code></pre>
<p>Horus107 schrieb:</p>
<blockquote>
<p>Die dritte Deklaration von init() in C ist allerdings notwendig, damit ich es dann in C::init() definieren kann. Stimmt das so?</p>
</blockquote>
<p>Jo! Vielleicht, daß mein Kollege sie nicht aus versehen definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403443</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 11 Jun 2014 11:15:07 GMT</pubDate></item><item><title><![CDATA[Reply to Erneute Deklaration in abgeleiteter Klasse on Wed, 11 Jun 2014 11:39:29 GMT]]></title><description><![CDATA[<p>Biolunar schrieb:</p>
<blockquote>
<p>Die (erneute) Deklaration in C ist notwendig, damit der Compiler weiß ab wann die Methode nicht mehr pur-virtuell ist! Man kann nämlich auch für die puren virtuellen Methoden eine Definition angeben und diese somit auch in den abgeleiteten Klassen aufrufen. Eine Definition reicht also nicht aus um zu zeigen, dass eine Methode pur oder nicht pur ist.</p>
</blockquote>
<p>Wie sähe denn sowas aus? Also eine Definiton für eine pur-virtuelle Methode (z.B. B::init) und diese dann in C verwenden. So hat es bei mir nicht geklappt:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

// HPP-File

class A {
public:
  virtual void init(int i) = 0;
};

class B : public A {
public:
  virtual void init(int i) = 0;
};

class C : public B {
public:
  virtual void init(int i);
};

// CPP-File

void B::init(int i) {
  cout&lt;&lt;&quot;B::A &quot;&lt;&lt;i&lt;&lt;endl;
}

// void C::init(int i) {
//   cout&lt;&lt;&quot;C::A &quot;&lt;&lt;i&lt;&lt;endl;
// }

int main(int argc, char* argv[])
{
  // B b;
  C c;
  // b.init(1);
  c.init(2);

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2403450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403450</guid><dc:creator><![CDATA[Horus107]]></dc:creator><pubDate>Wed, 11 Jun 2014 11:39:29 GMT</pubDate></item><item><title><![CDATA[Reply to Erneute Deklaration in abgeleiteter Klasse on Wed, 11 Jun 2014 11:49:31 GMT]]></title><description><![CDATA[<p>Du musst C::init trotzdem noch definieren, kannst aber B::init aufrufen:</p>
<pre><code>void C:init(int i)
{
  B::init(i);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2403452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403452</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Wed, 11 Jun 2014 11:49:31 GMT</pubDate></item><item><title><![CDATA[Reply to Erneute Deklaration in abgeleiteter Klasse on Wed, 11 Jun 2014 11:53:06 GMT]]></title><description><![CDATA[<p>Du brauchtst schon noch die Definition von <code>init</code> in C.</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

class A {
public:
  virtual void init(int i) = 0;
};

class B : public A {
public:
  virtual void init(int i) = 0;
};

class C : public B {
public:
  virtual void init(int i);
};

void B::init(int i) {
  cout&lt;&lt;&quot;B::A &quot;&lt;&lt;i&lt;&lt;endl;
}

void C::init(int i) {
  B::init(i); // hier kannst du die pure virtuelle Methode aufrufen, weil du eine Definition von dieser hast
  cout&lt;&lt;&quot;C::A &quot;&lt;&lt;i&lt;&lt;endl;
}

int main(int argc, char* argv[])
{
  C c;
  //c.A::init(4); // fehler, da keine Definition
  c.B::init(3); // geht auch
  c.init(2);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2403454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403454</guid><dc:creator><![CDATA[Biolunar]]></dc:creator><pubDate>Wed, 11 Jun 2014 11:53:06 GMT</pubDate></item></channel></rss>