<?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[Wieso blockt die Vererbung Polymorphie?]]></title><description><![CDATA[<p>Moin, moin!</p>
<p>Ich bin neulich über folgendes Verhalten gestolpert, nachdem ich in einer abgeleiteten Klasse eine neue Methode implementiert habe.</p>
<pre><code class="language-cpp">class A
{
public:
   virtual void foo() {std::cout &lt;&lt; &quot;class A::foo(void)\n&quot;;}
};

class B : public A
{
public:
   void foo(int) {std::cout &lt;&lt; &quot;class B::foo(int)\n&quot;;}
};

int main( int argc, void **argvv)
{
   B b;
   A *pa = &amp;b;

   b.foo(); // Fehler: er kennt nur void foo(int)
   pa-&gt;foo(); // kein Fehler
}
</code></pre>
<p>Wenn ich die Methode in der Klasse B auskommentiere ist alles gut. Man kann auch statt der fehlerhaften Zeile schreiben:</p>
<pre><code class="language-cpp">b.A::foo(); // so geht es!
</code></pre>
<p>So weit so gut, die Frage ist: Warum kennt der Compiler in der abgeleiteten Klasse die Methoden der Basisklasse nicht mehr?</p>
<p>Ist das um &quot;versehentliche&quot; Aufrufe von Methoden der Basisklassen zu unterbinden, oder hat das technische Gründe?</p>
<p>Ich finde es recht umständlich, wenn ich bestehende Klassen erweitern muss. Entweder ich verwende einen anderen Methodennamen oder ich muss alle Methode in der Klasse wiederholen:</p>
<pre><code class="language-cpp">class B : public A
{
public:
   void foo() { A::foo(); }
   void foo(int) { std::cout &lt;&lt; &quot;class B::foo(int)\n&quot;; }
};
</code></pre>
<p>Schön ist sowas nicht...</p>
<p>Was denkt ihr dazu?</p>
<p>LG, Dirk</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/300191/wieso-blockt-die-vererbung-polymorphie</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 22:51:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/300191.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Feb 2012 14:54:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wieso blockt die Vererbung Polymorphie? on Mon, 27 Feb 2012 14:54:56 GMT]]></title><description><![CDATA[<p>Moin, moin!</p>
<p>Ich bin neulich über folgendes Verhalten gestolpert, nachdem ich in einer abgeleiteten Klasse eine neue Methode implementiert habe.</p>
<pre><code class="language-cpp">class A
{
public:
   virtual void foo() {std::cout &lt;&lt; &quot;class A::foo(void)\n&quot;;}
};

class B : public A
{
public:
   void foo(int) {std::cout &lt;&lt; &quot;class B::foo(int)\n&quot;;}
};

int main( int argc, void **argvv)
{
   B b;
   A *pa = &amp;b;

   b.foo(); // Fehler: er kennt nur void foo(int)
   pa-&gt;foo(); // kein Fehler
}
</code></pre>
<p>Wenn ich die Methode in der Klasse B auskommentiere ist alles gut. Man kann auch statt der fehlerhaften Zeile schreiben:</p>
<pre><code class="language-cpp">b.A::foo(); // so geht es!
</code></pre>
<p>So weit so gut, die Frage ist: Warum kennt der Compiler in der abgeleiteten Klasse die Methoden der Basisklasse nicht mehr?</p>
<p>Ist das um &quot;versehentliche&quot; Aufrufe von Methoden der Basisklassen zu unterbinden, oder hat das technische Gründe?</p>
<p>Ich finde es recht umständlich, wenn ich bestehende Klassen erweitern muss. Entweder ich verwende einen anderen Methodennamen oder ich muss alle Methode in der Klasse wiederholen:</p>
<pre><code class="language-cpp">class B : public A
{
public:
   void foo() { A::foo(); }
   void foo(int) { std::cout &lt;&lt; &quot;class B::foo(int)\n&quot;; }
};
</code></pre>
<p>Schön ist sowas nicht...</p>
<p>Was denkt ihr dazu?</p>
<p>LG, Dirk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186255</guid><dc:creator><![CDATA[dibada]]></dc:creator><pubDate>Mon, 27 Feb 2012 14:54:56 GMT</pubDate></item><item><title><![CDATA[Reply to Wieso blockt die Vererbung Polymorphie? on Mon, 27 Feb 2012 14:58:54 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>dibada schrieb:</p>
<blockquote>
<p>So weit so gut, die Frage ist: Warum kennt der Compiler in der abgeleiteten Klasse die Methoden der Basisklasse nicht mehr?</p>
</blockquote>
<p>Weil er nur solange sucht, bis er einen passendne Namen findet.</p>
<p>dibada schrieb:</p>
<blockquote>
<p>Entweder ich verwende einen anderen Methodennamen oder ich muss alle Methode in der Klasse wiederholen:</p>
</blockquote>
<p>Oder du machst die Funktion mittels using bekannt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186258</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Mon, 27 Feb 2012 14:58:54 GMT</pubDate></item><item><title><![CDATA[Reply to Wieso blockt die Vererbung Polymorphie? on Mon, 27 Feb 2012 15:00:55 GMT]]></title><description><![CDATA[<p><a href="http://www2.research.att.com/~bs/bs_faq2.html#overloadderived" rel="nofollow">http://www2.research.att.com/~bs/bs_faq2.html#overloadderived</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186260</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 27 Feb 2012 15:00:55 GMT</pubDate></item><item><title><![CDATA[Reply to Wieso blockt die Vererbung Polymorphie? on Mon, 27 Feb 2012 15:09:10 GMT]]></title><description><![CDATA[<p>using? Ich dachte das ist nur für namespaces.</p>
<p>Wie kann mir dabei ein using helfen?</p>
<p>EDIT: Habs gefunden. Das kannte ich noch nicht. Das macht ja sogar alle Methoden der Basis auf einmal bekannt. <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>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186262</guid><dc:creator><![CDATA[dibada]]></dc:creator><pubDate>Mon, 27 Feb 2012 15:09:10 GMT</pubDate></item><item><title><![CDATA[Reply to Wieso blockt die Vererbung Polymorphie? on Mon, 27 Feb 2012 15:06:23 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">using base::foo;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2186264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186264</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 27 Feb 2012 15:06:23 GMT</pubDate></item><item><title><![CDATA[Reply to Wieso blockt die Vererbung Polymorphie? on Mon, 27 Feb 2012 15:11:52 GMT]]></title><description><![CDATA[<p>dibada schrieb:</p>
<blockquote>
<pre><code class="language-cpp">int main( int argc, void **argvv)
{
   B b;
   A *pa = &amp;b;

   b.foo(); // Fehler: er kennt nur void foo(int)
   pa-&gt;foo(); // kein Fehler
}
</code></pre>
<pre><code class="language-cpp">b.A::foo(); // so geht es!
</code></pre>
<p>So weit so gut, die Frage ist: Warum kennt der Compiler in der abgeleiteten Klasse die Methoden der Basisklasse nicht mehr?</p>
</blockquote>
<p>Kennen tut er die schon. Der &quot;Namelookup&quot; hört aber dann auf, wenn ein Name gefunden wurde. In der Basisklasse wird dann nicht mehr nachgeguckt. Den Effekt nennt man &quot;Name Hiding&quot;. Das gibt's auch anders, z.B. hier:</p>
<pre><code class="language-cpp">int i = 23;

void foo() {
  int i = 42;
  cout &lt;&lt;   i &lt;&lt; endl; // 42
  cout &lt;&lt; ::i &lt;&lt; endl; // 23
}
</code></pre>
<p>dibada schrieb:</p>
<blockquote>
<p>Ist das um &quot;versehentliche&quot; Aufrufe von Methoden der Basisklassen zu unterbinden, oder hat das technische Gründe?</p>
</blockquote>
<p>Er ergibt sich auch dem Namelookup, was von &quot;innen&quot; nach &quot;außen&quot; bzw von &quot;Derived&quot; nach &quot;Base&quot; arbeitet und dann abbricht, wenn etwas gefunden wurde. (Dann gibt's noch ADL oder auch bekannt als Koenig-Lookup). Aber das führt jetzt zu weit. Du liest das am besten in einem Buch Deines Vertrauens nach.</p>
<p>dibada schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class B : public A
{
public:
   void foo() { A::foo(); }
   void foo(int) { std::cout &lt;&lt; &quot;class B::foo(int)\n&quot;; }
};
</code></pre>
</blockquote>
<p>Abhilfe:</p>
<pre><code class="language-cpp">class B : public A
{
public:
   using A::foo;
   void foo(int) { std::cout &lt;&lt; &quot;class B::foo(int)\n&quot;; }
};
</code></pre>
<p>Das ist eine sogenannte Using-Deklaration.</p>
<p>Edit: Wow, habe ich lange gebraucht heute ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186267</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 27 Feb 2012 15:11:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wieso blockt die Vererbung Polymorphie? on Mon, 27 Feb 2012 15:12:46 GMT]]></title><description><![CDATA[<p>[/quote]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186268</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 27 Feb 2012 15:12:46 GMT</pubDate></item></channel></rss>