<?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[Methode der Basisklasse wird mit und ohne &#x27;virtual&#x27; überschrieben]]></title><description><![CDATA[<p>Hallo,</p>
<p>in der Überschrift steht bereits das Problem. Obwohl ich eine Methode der Basisklasse nicht als virtual kennzeichne wird diese von der abgeleiteten Klasse überschrieben;</p>
<p>Basisklasse:</p>
<pre><code class="language-cpp">class Zahl
{
public:
	string str() const;
};
</code></pre>
<p>bzw</p>
<pre><code class="language-cpp">class Zahl
{
public:
	virtual string str() const;
};
</code></pre>
<pre><code class="language-cpp">string Zahl::str() const
{
	return &quot;Eine unbekannte Zahl&quot;;
}
</code></pre>
<p>Die abgeleitete Klasse:</p>
<pre><code class="language-cpp">class GanzeZahl : public Zahl
{
private:
	int zahl;
public:
	GanzeZahl(int zahl);
	string str() const;
};

GanzeZahl::GanzeZahl(int zahl)
{
	this-&gt;zahl=zahl;
}

string GanzeZahl::str() const
{
	stringstream ss;
	ss &lt;&lt; zahl;
	return ss.str();
}
</code></pre>
<pre><code class="language-cpp">int main()
{
	GanzeZahl gz(1234);
	cout &lt;&lt; gz.str() &lt;&lt; endl;
	Zahl z(gz);
	cout &lt;&lt; z.str() &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Egal ob ich das Schlüsselword virtual verwende oder nicht, die Ausgabe der Konsole ist die gleiche.</p>
<p>Und wo ich schonmal hier bin... warum akzeptiert Zahl eine ganze Zahl als Parameter des Konstruktors? Was passiert da? Es ist kein Konstruktor definiert oder deklariert.</p>
<p>Vielen Dank schonmal.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/260397/methode-der-basisklasse-wird-mit-und-ohne-virtual-überschrieben</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 02:27:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/260397.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Feb 2010 16:19:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Methode der Basisklasse wird mit und ohne &#x27;virtual&#x27; überschrieben on Thu, 04 Feb 2010 16:19:06 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>in der Überschrift steht bereits das Problem. Obwohl ich eine Methode der Basisklasse nicht als virtual kennzeichne wird diese von der abgeleiteten Klasse überschrieben;</p>
<p>Basisklasse:</p>
<pre><code class="language-cpp">class Zahl
{
public:
	string str() const;
};
</code></pre>
<p>bzw</p>
<pre><code class="language-cpp">class Zahl
{
public:
	virtual string str() const;
};
</code></pre>
<pre><code class="language-cpp">string Zahl::str() const
{
	return &quot;Eine unbekannte Zahl&quot;;
}
</code></pre>
<p>Die abgeleitete Klasse:</p>
<pre><code class="language-cpp">class GanzeZahl : public Zahl
{
private:
	int zahl;
public:
	GanzeZahl(int zahl);
	string str() const;
};

GanzeZahl::GanzeZahl(int zahl)
{
	this-&gt;zahl=zahl;
}

string GanzeZahl::str() const
{
	stringstream ss;
	ss &lt;&lt; zahl;
	return ss.str();
}
</code></pre>
<pre><code class="language-cpp">int main()
{
	GanzeZahl gz(1234);
	cout &lt;&lt; gz.str() &lt;&lt; endl;
	Zahl z(gz);
	cout &lt;&lt; z.str() &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Egal ob ich das Schlüsselword virtual verwende oder nicht, die Ausgabe der Konsole ist die gleiche.</p>
<p>Und wo ich schonmal hier bin... warum akzeptiert Zahl eine ganze Zahl als Parameter des Konstruktors? Was passiert da? Es ist kein Konstruktor definiert oder deklariert.</p>
<p>Vielen Dank schonmal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1850533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1850533</guid><dc:creator><![CDATA[VirtualStatic]]></dc:creator><pubDate>Thu, 04 Feb 2010 16:19:06 GMT</pubDate></item><item><title><![CDATA[Reply to Methode der Basisklasse wird mit und ohne &#x27;virtual&#x27; überschrieben on Thu, 04 Feb 2010 16:39:38 GMT]]></title><description><![CDATA[<p>VirtualStatic schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>in der Überschrift steht bereits das Problem. Obwohl ich eine Methode der Basisklasse nicht als virtual kennzeichne wird diese von der abgeleiteten Klasse überschrieben;</p>
</blockquote>
<p>Nein, sie wird überdeckt.</p>
<blockquote>
<pre><code class="language-cpp">int main()
{
	GanzeZahl gz(1234);
	cout &lt;&lt; gz.str() &lt;&lt; endl;
	Zahl z(gz);
	cout &lt;&lt; z.str() &lt;&lt; endl;
	
	return 0;
}
</code></pre>
</blockquote>
<p>Beim ersten wird GanzeZahl::str und beim zweiten Zahl::str aufgerufen. Versuch mal so:</p>
<pre><code class="language-cpp">GanzeZahl gz(1234);
Zahl&amp; z = gz;
z.str()
</code></pre>
<p>Mit virtual wird die Methode von GanzeZahl, ohne virtual die von Zahl aufgerufen.</p>
<blockquote>
<p>Und wo ich schonmal hier bin... warum akzeptiert Zahl eine ganze Zahl als Parameter des Konstruktors? Was passiert da? Es ist kein Konstruktor definiert oder deklariert.</p>
</blockquote>
<p>Das ist der automatisch erzeugte Kopierkonstruktor. Dabei gibt es übrigens sog. Slicing, d.h. es werden nur die Basisklassenanteile kopiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1850546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1850546</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 04 Feb 2010 16:39:38 GMT</pubDate></item><item><title><![CDATA[Reply to Methode der Basisklasse wird mit und ohne &#x27;virtual&#x27; überschrieben on Thu, 04 Feb 2010 16:52:34 GMT]]></title><description><![CDATA[<p>Es wird nicht überschrieben, sondern überdeckt/versteckt.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct Base
{
  void hide() const { std::cout &lt;&lt; &quot;Base::hide\n&quot;; }
  virtual void override() const { std::cout &lt;&lt; &quot;Base::override\n&quot;; }
};

struct Derived
  : Base
{
  void hide() const { std::cout &lt;&lt; &quot;Derived::hide\n&quot;; }
  void override() const { std::cout &lt;&lt; &quot;Derived::override\n&quot;; }
};

int main()
{
  Derived d;
  d.hide();       // Derived::hide
  d.override();   // Derived::override

  Base* pb = &amp;d;
  pb-&gt;hide();     // Base::hide
  pb-&gt;override(); // Derived::override

  Base b;
  b.hide();       // Base::hide
  b.override();   // Base::override

  return 0;
}
</code></pre>
<p>Bei einer verstecken/überdeckten Methode ist der statische Typ der Variable entscheidend, was aufgerufen wird.</p>
<p>VirtualStatic schrieb:</p>
<blockquote>
<p>Und wo ich schonmal hier bin... warum akzeptiert Zahl eine ganze Zahl als Parameter des Konstruktors? Was passiert da? Es ist kein Konstruktor definiert oder deklariert.</p>
</blockquote>
<p><code>Zahl</code> erstellt automatisch einen Kopierkonstruktor, welcher einen <code>Zahl const&amp;</code> Parameter hat. Daher kannst du auch ein Objekt von <code>GanzeZahl</code> übergeben. Dabei entsteht aber ein <em>Object-Slicing</em>, also nur der Teil der Basisklasse <code>Zahl</code> von <code>GanzeZahl</code> wird kopiert und der Rest ignoriert. Sehr gefährlich <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>
<p>Grüssli</p>
<p>Edit: Schreibfehler. Wo hab ich bloss meinen Duden hingelegt? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1850547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1850547</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 04 Feb 2010 16:52:34 GMT</pubDate></item><item><title><![CDATA[Reply to Methode der Basisklasse wird mit und ohne &#x27;virtual&#x27; überschrieben on Thu, 04 Feb 2010 16:42:13 GMT]]></title><description><![CDATA[<p>Du hast denke ich den Sinn von virtuellen Funktionen nicht ganz verstanden.</p>
<p>Der Sinn ist ohne zu wissen, was für eine Ableitung von Zahl sich genau hinter einem Zeiger auf <code>Zahl</code> und trotzdem die richtige Funktion aufzurufen.</p>
<pre><code class="language-cpp">int main()
{
 GanzeZahl gz(1234);
 Zahl* z = &amp;gz;

 cout &lt;&lt; z-&gt;str ();
}
</code></pre>
<p>Da wird der obwohl der statische Typ Zahl ist das str von GanzeZahl aufgerufen, weil der dynamische Typ GanzeZahl ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1850549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1850549</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 04 Feb 2010 16:42:13 GMT</pubDate></item><item><title><![CDATA[Reply to Methode der Basisklasse wird mit und ohne &#x27;virtual&#x27; überschrieben on Thu, 04 Feb 2010 16:50:47 GMT]]></title><description><![CDATA[<p>Super!</p>
<p>Vielen Dank an Euch! *****</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1850555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1850555</guid><dc:creator><![CDATA[VirtualStatic]]></dc:creator><pubDate>Thu, 04 Feb 2010 16:50:47 GMT</pubDate></item><item><title><![CDATA[Reply to Methode der Basisklasse wird mit und ohne &#x27;virtual&#x27; überschrieben on Thu, 04 Feb 2010 16:51:57 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Edit: Schreifehler. Wo hab ich bloss meinen Duden hingelegt? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>Ohne Kommentar <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="😃"
    /><br />
(Und nächstes mal bitte nicht so laut :p)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1850557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1850557</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Thu, 04 Feb 2010 16:51:57 GMT</pubDate></item><item><title><![CDATA[Reply to Methode der Basisklasse wird mit und ohne &#x27;virtual&#x27; überschrieben on Thu, 04 Feb 2010 16:54:01 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Edit: Schreifehler. Wo hab ich bloss meinen Duden hingelegt? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>Ohne Kommentar <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="😃"
    /><br />
(Und nächstes mal bitte nicht so laut :p)</p>
</blockquote>
<p>Ich glaube langsam, dass ich zu schnell schreibe und meine Tastatur verschluckt die Buchstaben. Was da immer an Buchstaben verloren gehen, unglaublich! <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>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1850561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1850561</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 04 Feb 2010 16:54:01 GMT</pubDate></item></channel></rss>