<?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[Deklaration von virtualen Funktionen]]></title><description><![CDATA[<p>Hallo,</p>
<p>Der folgende Code verhaltet sich nicht so wie erwartet:</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;iostream&gt;

using namespace std;

class A1 {
	public:
		virtual void test() { cout &lt;&lt; &quot;A1&quot; &lt;&lt; endl; }
};

class B1 : public A1 {
	public:
		virtual void test() { test(1); }
		virtual void test(int value) { cout &lt;&lt; &quot;B1 &quot; &lt;&lt; value &lt;&lt; endl; }
};

class B2 : public A1 {
	public:
		virtual void test(int value = 1) { cout &lt;&lt; &quot;B2 &quot; &lt;&lt; value &lt;&lt; endl; }
};

int main(void) {
	A1 *test = new B1();
	test-&gt;test();			// Output B1 1
	delete test;
	test = new B2();
	test-&gt;test();			// Output A1
	delete test;
	return EXIT_SUCCESS;
}
</code></pre>
<p>Als Ausgabe bekomme ich:<br />
B1 1<br />
A1</p>
<p>statt wie erwartet:<br />
B1 1<br />
B2 1</p>
<p>Als Kompiler verwende ich g++ (GCC) 4.2.4.<br />
Leider bin ich in c++ nicht so erfahren und bitte daher um hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/234341/deklaration-von-virtualen-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 11:00:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/234341.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Feb 2009 17:58:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Deklaration von virtualen Funktionen on Mon, 16 Feb 2009 17:58:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Der folgende Code verhaltet sich nicht so wie erwartet:</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;iostream&gt;

using namespace std;

class A1 {
	public:
		virtual void test() { cout &lt;&lt; &quot;A1&quot; &lt;&lt; endl; }
};

class B1 : public A1 {
	public:
		virtual void test() { test(1); }
		virtual void test(int value) { cout &lt;&lt; &quot;B1 &quot; &lt;&lt; value &lt;&lt; endl; }
};

class B2 : public A1 {
	public:
		virtual void test(int value = 1) { cout &lt;&lt; &quot;B2 &quot; &lt;&lt; value &lt;&lt; endl; }
};

int main(void) {
	A1 *test = new B1();
	test-&gt;test();			// Output B1 1
	delete test;
	test = new B2();
	test-&gt;test();			// Output A1
	delete test;
	return EXIT_SUCCESS;
}
</code></pre>
<p>Als Ausgabe bekomme ich:<br />
B1 1<br />
A1</p>
<p>statt wie erwartet:<br />
B1 1<br />
B2 1</p>
<p>Als Kompiler verwende ich g++ (GCC) 4.2.4.<br />
Leider bin ich in c++ nicht so erfahren und bitte daher um hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664860</guid><dc:creator><![CDATA[Chri]]></dc:creator><pubDate>Mon, 16 Feb 2009 17:58:48 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration von virtualen Funktionen on Mon, 16 Feb 2009 18:07:07 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;stdio.h&gt;    // brauchst du nicht
#include &lt;stdlib.h&gt;   // die auch nicht
#include &lt;iostream&gt;

using namespace std;

class A1 {
    public:
        virtual void test() { cout &lt;&lt; &quot;A1&quot; &lt;&lt; endl; }
};

class B1 : public A1 {
    public:
        virtual void test() { test(1); }
        virtual void test(int value) { cout &lt;&lt; &quot;B1 &quot; &lt;&lt; value &lt;&lt; endl; }
};

class B2 : public A1 {
    public:
        virtual void test(int value = 1) { cout &lt;&lt; &quot;B2 &quot; &lt;&lt; value &lt;&lt; endl; }
};

int main(void) {
    A1 *test = new B1();
    test-&gt;test();            // Output B1 1
    delete test;
    test = new B2();
    test-&gt;test();            // Output A1
    delete test;
    return EXIT_SUCCESS;
}
</code></pre>
<p>Du vererbst B2 A1, B2 sieht also nachher so aus:</p>
<pre><code class="language-cpp">class B2 : public A1 {
    public:
        virtual void test(int value = 1) { cout &lt;&lt; &quot;B2 &quot; &lt;&lt; value &lt;&lt; endl; }
        virtual void test() { cout &lt;&lt; &quot;A1&quot; &lt;&lt; endl; }
};
</code></pre>
<p>Dann rufst du die test() Methode ohne Parameter auf -&gt; A1 wird ausgegeben.</p>
<p>Probiers mal damit:</p>
<pre><code class="language-cpp">int main(void) {
    A1 *test = new B1();
    test-&gt;test();            // Output B1 1
    delete test;
    test = new B2();
    test-&gt;test(5);            // Output A1 =&gt; Output sollte B2 5 sein
    delete test;
    return EXIT_SUCCESS;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1664865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664865</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Mon, 16 Feb 2009 18:07:07 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration von virtualen Funktionen on Mon, 16 Feb 2009 18:22:39 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Leider ist es mir immer noch nicht klar, da sich die funktion test2 so verhält wie ich es mir auch von der funktion test erwarten würde:</p>
<pre><code>class B2 : public A1 {
	public:
		virtual void test(int value = 1) { cout &lt;&lt; &quot;B2 &quot; &lt;&lt; value &lt;&lt; endl; }
		virtual void test2(int value = 5) { cout &lt;&lt; &quot;B2 test2 &quot; &lt;&lt; value &lt;&lt; endl; };
};

int main(void) {
	A1 *test = new B1();
	test-&gt;test();			// Output B1 1
	delete test;
	test = new B2();
	test-&gt;test();			// Output A1
	B2* test1 = dynamic_cast&lt;B2*&gt;(test);
	test1-&gt;test2();			// B2 test2 5
	test1-&gt;test2(10);		// B2 test2 10
	delete test;
	return EXIT_SUCCESS;
}
</code></pre>
<p>Warum wird die deklaration</p>
<pre><code>virtual void test(int value = 1) { cout &lt;&lt; &quot;B2 &quot; &lt;&lt; value &lt;&lt; endl; }
</code></pre>
<p>nicht in</p>
<pre><code>virtual void test() { test(1); }
virtual void test(int value) { cout &lt;&lt; &quot;B1 &quot; &lt;&lt; value &lt;&lt; endl; }
</code></pre>
<p>umgeschrieben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664877</guid><dc:creator><![CDATA[Chri]]></dc:creator><pubDate>Mon, 16 Feb 2009 18:22:39 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration von virtualen Funktionen on Mon, 16 Feb 2009 22:30:36 GMT]]></title><description><![CDATA[<p>Was meinst du genau mit &quot;umgeschrieben&quot;? Wenn eine Funktion Standardparameter besitzt, dann werden bei einem Weglassen der Argumente die dort angegebenen Werte eingesetzt. Die Funktion bleibt die Gleiche.</p>
<p>Und benutze bitte [cpp]-Tags anstatt [code]-Tags, dann ist dein Code nämlich viel lesbarer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1665002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1665002</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 16 Feb 2009 22:30:36 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration von virtualen Funktionen on Tue, 17 Feb 2009 01:00:46 GMT]]></title><description><![CDATA[<p>Chri schrieb:</p>
<blockquote>
<p>Warum wird die deklaration</p>
<pre><code>virtual void test(int value = 1) { cout &lt;&lt; &quot;B2 &quot; &lt;&lt; value &lt;&lt; endl; }
</code></pre>
<p>nicht in</p>
<pre><code>virtual void test() { test(1); }
virtual void test(int value) { cout &lt;&lt; &quot;B1 &quot; &lt;&lt; value &lt;&lt; endl; }
</code></pre>
<p>umgeschrieben?</p>
</blockquote>
<p>Weil das in C++ eben einfach nicht so ist!?!<br />
Default-Parameter sind genau das: Default-Parameter.</p>
<p>Die führen aber *nicht* dazu dass mehr als nur eine Funktion angelegt wird!<br />
Default-Parameter kannst du dir so vorstellen, dass der Compiler überall wo die Funktion aufgerufen wird, den entsprechenden Wert einsetzt. Nicht mehr und nicht weniger.</p>
<p>Klar jetzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1665049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1665049</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 17 Feb 2009 01:00:46 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration von virtualen Funktionen on Tue, 17 Feb 2009 07:23:16 GMT]]></title><description><![CDATA[<p>danke für die hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1665075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1665075</guid><dc:creator><![CDATA[Chri]]></dc:creator><pubDate>Tue, 17 Feb 2009 07:23:16 GMT</pubDate></item><item><title><![CDATA[Reply to Deklaration von virtualen Funktionen on Tue, 17 Feb 2009 16:23:29 GMT]]></title><description><![CDATA[<p>Ich weiß nicht, ob das klar geworden ist und ich hoffe jetzt nicht auch noch zur Verwirrung beizutragen. <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>Aber, obwohl eine Funktion wie z.B.</p>
<pre><code class="language-cpp">void f(int=0) { 
 //... 
}
</code></pre>
<p>ohne Parameter aufgerufen werden kann</p>
<pre><code class="language-cpp">f()
</code></pre>
<p>deklarieren die Beiden Prototypen</p>
<pre><code class="language-cpp">void f()
void f(int=0)
</code></pre>
<p>völlig unterschiedliche Funktionen.</p>
<p>D.h. in deinem ersten Codebeispiel</p>
<pre><code class="language-cpp">class A1 {
    public:
        virtual void test() { cout &lt;&lt; &quot;A1&quot; &lt;&lt; endl; }
};

//..

class B2 : public A1 {
    public:
        virtual void test(int value = 1) { cout &lt;&lt; &quot;B2 &quot; &lt;&lt; value &lt;&lt; endl; }
};
</code></pre>
<p>überschreibt <strong>B2::test(int)</strong> NICHT die Funktion <strong>A1::test(void)</strong> der Basisklasse auch wenn <strong>B2::test(int)</strong> durch das Standardargument ohne Übergabe eines Wertes aufgerufen werden kann.</p>
<pre><code class="language-cpp">B2* pB2 = new B2();
pB2-&gt;test(); // funktioniert zwar, dennoch bleibt die Funktion vom 
             // Typ void test(int) und überschreibt nicht die 
             // Basisklassenfunktion, die ja vom Typ void test(void)ist
</code></pre>
<p>Das kannst du dir ganz leicht klar machen wenn du die Funktion der Basisklasse als rein virtuelle Funktion deklarierst. Dann scheitert nämliche das Folgende:</p>
<pre><code class="language-cpp">class A1 {
    public:
        virtual void test() = 0; // rein virtuell
};

//...

A1 *test = new B1();
test-&gt;test();            // Output B1 1
delete test;
test = new B2(); // Fehler!!!
test-&gt;test();   // Fehler!!!
</code></pre>
<p>Hoffe nicht weiter vewirrt zu haben. <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/1665378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1665378</guid><dc:creator><![CDATA[Kritiker]]></dc:creator><pubDate>Tue, 17 Feb 2009 16:23:29 GMT</pubDate></item></channel></rss>