<?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[Vererbungsfrage]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich komme eigentlich aus der .NET Welt, bzw. C# Welt.</p>
<p>Jetzt frage ich mich, ob es in C++ ein äquivalentes Beispiel zu folgendem Beispiel gibt:</p>
<p>- Eine Basisklasse mit einer virtuellen Methode<br />
- Eine Kindklasse A (erbt Basis), die die Methode mit [C#] override überschreibt<br />
- Eine Kindklasse B (erbt Basis), die die Methode mit [C#] new überschreibt</p>
<p>Folgender Effekt:</p>
<p>Bei Variante A ist das Ergebnis, dass die Methode gänzlich überschrieben wird, auch wenn man die Basismethode durch einen Cast aufruft.<br />
Bei Variante B ist nur eine neue Methode hinzugekommen, die die Basis Methode überdeckt. Ruft man die Basismethode durch einen Cast auf, so wird auch der Basiscode ausgeführt.</p>
<p>Wie sieht solch ein Besipiel in C++ aus?</p>
<p>Für Hilfe wäre ich sehr dankbar,<br />
Norman-Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/148200/vererbungsfrage</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 23:48:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/148200.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 May 2006 09:50:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbungsfrage on Wed, 24 May 2006 09:50:17 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich komme eigentlich aus der .NET Welt, bzw. C# Welt.</p>
<p>Jetzt frage ich mich, ob es in C++ ein äquivalentes Beispiel zu folgendem Beispiel gibt:</p>
<p>- Eine Basisklasse mit einer virtuellen Methode<br />
- Eine Kindklasse A (erbt Basis), die die Methode mit [C#] override überschreibt<br />
- Eine Kindklasse B (erbt Basis), die die Methode mit [C#] new überschreibt</p>
<p>Folgender Effekt:</p>
<p>Bei Variante A ist das Ergebnis, dass die Methode gänzlich überschrieben wird, auch wenn man die Basismethode durch einen Cast aufruft.<br />
Bei Variante B ist nur eine neue Methode hinzugekommen, die die Basis Methode überdeckt. Ruft man die Basismethode durch einen Cast auf, so wird auch der Basiscode ausgeführt.</p>
<p>Wie sieht solch ein Besipiel in C++ aus?</p>
<p>Für Hilfe wäre ich sehr dankbar,<br />
Norman-Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1064077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1064077</guid><dc:creator><![CDATA[norman_timo]]></dc:creator><pubDate>Wed, 24 May 2006 09:50:17 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsfrage on Wed, 24 May 2006 09:58:26 GMT]]></title><description><![CDATA[<p>Die Funktion, die auch nach dem Cast noch aufgerufen wird ist eine virtuelle Funktion, das andere eine nicht virutelle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1064080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1064080</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Wed, 24 May 2006 09:58:26 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsfrage on Wed, 24 May 2006 12:46:31 GMT]]></title><description><![CDATA[<p>Hallo Mathias,</p>
<p>so ganz verstehe ich Deine Aussage jetzt nicht.</p>
<p>Also werde ich mal ein Beispielcode aus der C# Welt posten, vielleicht wird es dann klarer, was ich wissen will:</p>
<p>Die Basis:</p>
<pre><code class="language-cpp">public class Basis
    {
        // Konstruktor
        public Basis()
        { }

        // Methode zum Überladen
        public virtual string PolyMethod()
        {
            return &quot;Hallo von der Basis!&quot;;
        }
    }
</code></pre>
<p>Variante A Klasse:</p>
<pre><code class="language-cpp">public class Kind_A : Basis
    {
        // Konstruktor
        public Kind_A()
        { }

        // Überladene Methode
        public override string PolyMethod()
        {
            return &quot;Hallo von Kind_A!&quot;;
        }
    }
</code></pre>
<p>Variante B Klasse:</p>
<pre><code class="language-cpp">public class Kind_B : Basis
    {
        // Konstruktor
        public Kind_B()
        { }

        // Überladene Methode
        public new string PolyMethod()
        {
            return &quot;Hallo von Kind_B!&quot;;
        }
    }
</code></pre>
<p>Wenn jetzt folgendes gemacht wird:</p>
<pre><code class="language-cpp">// lokale Variablen
Kind_A meinKindA = new Kind_A();
Kind_B meinKindB = new Kind_B();

// Variante A:
Console.WriteLine(
   meinKindA.PolyMethod()
   );
Console.WriteLine(
   ((Basis)meinKindA).PolyMethod()
   );

// Leerzeile
Console.Writeline();

// Variante B:
Console.WriteLine(
   meinKindB.PolyMethod()
   );
Console.WriteLine(
   ((Basis)meinKindB).PolyMethod()
   );
</code></pre>
<p>dann sieht man den Unterschied, denn als Ergebnis kommt folgendes zutage:</p>
<blockquote>
<p>Hallo von Kind_A!<br />
Hallo von Kind_A!</p>
<p>Hallo von Kind_B!<br />
Hallo von der Basis!</p>
</blockquote>
<p>Das würd ich gerne in C++ nachbauen, aber wie?</p>
<p>Gruß<br />
Norman-Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1064215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1064215</guid><dc:creator><![CDATA[norman_timo]]></dc:creator><pubDate>Wed, 24 May 2006 12:46:31 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsfrage on Wed, 24 May 2006 12:54:19 GMT]]></title><description><![CDATA[<p>So direkt in C++ lässt sich das nicht umsetzen - eine Methode ist entweder virtuell (dann hängt sie vom dynamischen Typ des Objekts ab - entspricht deiner Kind_A Version) oder eben nicht (dann hängt sie vom statischen Typ des Objekts ab - entspricht deinem Kind_B), Halbvirtuelle Funktionen gibt es nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1064226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1064226</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 24 May 2006 12:54:19 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsfrage on Wed, 24 May 2006 12:56:18 GMT]]></title><description><![CDATA[<p>In C++ bestimmt nur die Basisklasse den Typ der Überschreibung beim Ableiten... Eine Funktion die in der Basisklasse virtual ist, ist also in den Ableitungen immer &quot;override&quot; (um bei der C# Ausdrucksweise zu bleiben). Eine Funktion die in der Basisklasse non-virtual ist, ist in allen Ableitungen immer &quot;new&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1064233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1064233</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 24 May 2006 12:56:18 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsfrage on Wed, 24 May 2006 13:00:38 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>vielen Dank für die doch überraschende aber klare Aussage.</p>
<p>Schade, ich habe gedacht, dass das zum OO gehört, und dass das auch in C++ so realisierbar ist. Aber dass das nicht geht habe ich verstanden.</p>
<p>Vielen Dank.</p>
<p>Gruß<br />
Norman-Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1064239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1064239</guid><dc:creator><![CDATA[norman_timo]]></dc:creator><pubDate>Wed, 24 May 2006 13:00:38 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsfrage on Wed, 24 May 2006 15:49:02 GMT]]></title><description><![CDATA[<p>Nunja, man kann den Effekt in C++ schon erreichen, zB indem man PolyMethod in Kind_B einen default Parameter einer non-public nested Klasse mit gibt und dadurch eine andere Signatur erzwingt. Der Client wird bei der Verwendung keinen Unterschied merken Höchstens bei einem angegebenen Parameter beim Funktionsaufruf über eine andere Fehlermeldung überrascht sein. Ein andere Möglichkeit wäre evtl. auch statische Vererbung mittels Templates. Dennoch erschliesst sich mir nicht der Sinn des Ganzen. Ich denke, in C++ dürften sinnvolle Anwendungen davon relativ begrenzt sein. Die Philosophie ist nunmal eine etwas andere. virtual (override) wirkt _immer_ primär und ein downgrade ist nicht vorgesehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1064386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1064386</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Wed, 24 May 2006 15:49:02 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsfrage on Mon, 29 May 2006 16:04:11 GMT]]></title><description><![CDATA[<p>Hallo groovemaster,</p>
<p>da ich von der C# Welt komme, kenne ich dort zumindest das konkrete Beispiel die Methode <em>ToString()</em>, die JEDEM Objekt vererbt wird.</p>
<p>So ist das Problem, wenn ich diese Methode irgendwo fest überschreiben würde, dann wäre bei einem Cast auf ein hierarchisch höher liegenenden Typ die Eigenschaft verdreht, die die Methode eigentlich liefern sollte.</p>
<p>Also z.B. wenn ich bei einem UrUrUrVater die Methode aufrufe, könnte das eine andere Wirkung zeigen, wie wenn ich das von dem KindKindKind Objekt tun würde. Ein &quot;Backcast&quot; auf den UrUrUrVater sollte hier auch die ursprüngliche Methode liefern, weil sie z.B. in dessen Kontext sinnvoller ist.</p>
<p>Ich denke das ist schon recht &quot;brauchbar&quot;, auch wenn bisher darauf verzichtet werden musste.</p>
<p>Nichtsdestotrotz, wenn ich mit einem Pfeil durch die Brust ins Auge schießen muss, nur um diesen Effekt in C++ zu erreichen, dann überlege ich mir lieber einen anderen Designansatz <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>Gruß<br />
Norman-Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1067498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1067498</guid><dc:creator><![CDATA[norman_timo]]></dc:creator><pubDate>Mon, 29 May 2006 16:04:11 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsfrage on Mon, 29 May 2006 20:20:26 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>kann ich in C++ nicht immer auf eine Methode der Basisklasse zurückgreifen, in dem ich sie explizit aufrufe? Unter VS funktioniert es folgendermaßen:</p>
<p>Basisklasse:</p>
<pre><code class="language-cpp">class Basis
{
public:
	// Konstruktor
	Basis(void)
	{
	}

	// Methode zum Überladen
	virtual string PolyMethod(void)
	{
		return &quot;Hallo von der Basis!&quot;;
	}
};
</code></pre>
<p>Abgeleitete Klasse:</p>
<pre><code class="language-cpp">class Kind_A :
	public Basis
{
public:
	// Konstruktor
	Kind_A(void)
	{
	}

	// Überladene Methode
	string PolyMethod(void)
	{
		return &quot;Hallo von Kind_A!&quot;;
	}
};
</code></pre>
<p>Main:</p>
<pre><code class="language-cpp">int main(void)
{
	// lokale Variablen
	Kind_A meinKindA;

	// Ausgabe der redefinierten Methode
	cout &lt;&lt; meinKindA.PolyMethod() &lt;&lt; endl;

	// Ausgabe der Basismethode
	cout &lt;&lt; meinKindA.Basis::PolyMethod() &lt;&lt; endl;
	return 0;
}
</code></pre>
<p>erzeugt bei mir die Ausgabe:</p>
<pre><code>Hallo von Kind_A!
Hallo von der Basis!
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1067683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1067683</guid><dc:creator><![CDATA[Knecht]]></dc:creator><pubDate>Mon, 29 May 2006 20:20:26 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsfrage on Mon, 29 May 2006 21:24:06 GMT]]></title><description><![CDATA[<p>ja</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1067715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1067715</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Mon, 29 May 2006 21:24:06 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsfrage on Mon, 29 May 2006 22:22:36 GMT]]></title><description><![CDATA[<p>joomoo schrieb:</p>
<blockquote>
<p>ja</p>
</blockquote>
<p>Hm, soll das heißend, dass das standardkonform ist? Irgendwie bricht das mit dem Konzept von Vererbung finde ich... und kann ich das dann nur durch private/protected ableiten verhindern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1067742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1067742</guid><dc:creator><![CDATA[bluecode]]></dc:creator><pubDate>Mon, 29 May 2006 22:22:36 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsfrage on Mon, 29 May 2006 22:48:08 GMT]]></title><description><![CDATA[<p>Mir ist leider nicht bekannt, ob es sich hierbei um standard-konformes C++ handelt. Jedenfalls ist es so nachzulesen im Buch von Jesse Liberty. Die Deutsche übersetzung heist:</p>
<p>Jetzt lerne ich C++, Markt &amp; Technik Verlag, 2000</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1067747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1067747</guid><dc:creator><![CDATA[Knecht]]></dc:creator><pubDate>Mon, 29 May 2006 22:48:08 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsfrage on Tue, 30 May 2006 06:58:08 GMT]]></title><description><![CDATA[<p>norman_timo schrieb:</p>
<blockquote>
<p>da ich von der C# Welt komme, kenne ich dort zumindest das konkrete Beispiel die Methode <em>ToString()</em>, die JEDEM Objekt vererbt wird.</p>
<p>So ist das Problem, wenn ich diese Methode irgendwo fest überschreiben würde, dann wäre bei einem Cast auf ein hierarchisch höher liegenenden Typ die Eigenschaft verdreht, die die Methode eigentlich liefern sollte.</p>
<p>Also z.B. wenn ich bei einem UrUrUrVater die Methode aufrufe, könnte das eine andere Wirkung zeigen, wie wenn ich das von dem KindKindKind Objekt tun würde. Ein &quot;Backcast&quot; auf den UrUrUrVater sollte hier auch die ursprüngliche Methode liefern, weil sie z.B. in dessen Kontext sinnvoller ist.</p>
</blockquote>
<p>Ich denke trotzdem, dass dies nicht sinnvoll ist, zumindest in C++ (für C# kann ich das nicht beurteilen). Denn durch einen Cast veränderst du das ursprünglich erstellte Objekt ja nicht. Du &quot;interpretierst&quot; es lediglich in einem engeren (Upcast) oder weiteren (Downcast) Kontext neu. Also wäre es auch unlogisch, wenn ein und dieselbe Funktion plötzlich was ganz anderes macht. Damit geht einfach ein Grundprinzip von OO verloren, indem du halt nicht mehr objektorientiert, sondern typorientiert denkst.</p>
<p>norman_timo schrieb:</p>
<blockquote>
<p>Nichtsdestotrotz, wenn ich mit einem Pfeil durch die Brust ins Auge schießen muss, nur um diesen Effekt in C++ zu erreichen, dann überlege ich mir lieber einen anderen Designansatz <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>
</blockquote>
<p>Ich wollte dir ja nur zeigen, dass es durchaus möglich ist. Empfehlen würde ich das aber nicht und ein anderer Designansatz ist auf jeden Fall der richtige Weg.</p>
<p>Knecht schrieb:</p>
<blockquote>
<p>kann ich in C++ nicht immer auf eine Methode der Basisklasse zurückgreifen</p>
</blockquote>
<p>Sofern public, ja. Damit brichst du aber im Beispiel das Open-Closed Prinzip, indem du Implementationsdetails freilegst, und ist daher nicht zu empfehlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1067804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1067804</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Tue, 30 May 2006 06:58:08 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsfrage on Tue, 30 May 2006 07:41:11 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>Knecht schrieb:</p>
<blockquote>
<p>kann ich in C++ nicht immer auf eine Methode der Basisklasse zurückgreifen</p>
</blockquote>
<p>Sofern public, ja. Damit brichst du aber im Beispiel das Open-Closed Prinzip, indem du Implementationsdetails freilegst, und ist daher nicht zu empfehlen.</p>
</blockquote>
<p>Klassen-Methoden sind doch in der Regel Öffentlich um dem Benutzer Zugriff auf private Element einer Klasse, in einem Vorgegebenen Rahmen zu ermöglichen. Eine Hirarchie/Vererbung kann ich aufbauen, wenn zwei Dinge verwand sind.</p>
<p>Z.B. ist ein Kreis eine sonderform der Ellipse. Ich kann also eine Kreis-Klasse von der Ellipsen-Klasse ableiten und die Methode zur Berechnung der Fläche der Ellipse (a*b*π) verbergen durch die Spezialisierung für den Kreis (r<sup>2</sup>*π) die angemessener und den meisten Menschen vertrauter ist. Deswegen ist es aber nicht prinzipiell &quot;falsch&quot; auf die Formel der Ellipsenfläche zurückzugreifen. Die liefert, vielleicht etwas umständlicher da nicht so spezialisiert, das richtige Ergebnis.</p>
<p>Deswegen hab ich aber doch noch keine Implementierungsdetails offengelegt, da ja beide Flächenberechnungs-Methoden &quot;Zugriffs&quot;-Methoden sind. Oder?!? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1067822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1067822</guid><dc:creator><![CDATA[Knecht]]></dc:creator><pubDate>Tue, 30 May 2006 07:41:11 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsfrage on Tue, 30 May 2006 09:02:52 GMT]]></title><description><![CDATA[<p>Doch, dadurch hast du Implementationsdetails offen gelegt. Du denkst zu sehr kontextbezogen und zu wenig allgemein. In deinem Beispiel mag es zwar egal sein, ob du a.flaeche(x) oder a.ellipse::flaeche(x, x) schreibst, da beides das gleiche Ergebnis liefert. Der entscheidende Punkt ist aber, dass du einen Kreis hast und diese Klasse eine Funktion flaeche() breitstellt. Du rufst dementsprechend kreis.flaeche() auf und nichts anderes. Was intern passiert, weisst du nicht und hat dich auch überhaupt nicht zu interessieren. Es ist eben die Angelegenheit der Klasse Kreis, wie sie die Funktion flaeche implementiert. Sie kann die Funktion der Basisklasse aufrufen, einen eigenen Algorithmus definieren, nebenbei noch die Lottozahlen checken ... wissen wir alles nicht. Für uns ist die Funktion eine Black Box, wir geben was rein und bekommen was raus. Diese Schnittstelle ist fest und wird nicht geändert. Halt das &quot;Closed&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> geschlossen für Veränderungen. Die Funktion flaeche kann intern jederzeit geändert werden, zB ein neuer Algorithmus verwendet werden. Client Code wird dadurch aber nicht obsolet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1067881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1067881</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Tue, 30 May 2006 09:02:52 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsfrage on Tue, 30 May 2006 09:19:19 GMT]]></title><description><![CDATA[<p>So hab ich's noch gar nicht gesehen!!!</p>
<p>Danke für den Hinweis <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/1067888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1067888</guid><dc:creator><![CDATA[Knecht]]></dc:creator><pubDate>Tue, 30 May 2006 09:19:19 GMT</pubDate></item></channel></rss>