<?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[Hebt Polymorphismus einige Wirkungsweisen&#x2F;Vorteile von Vererbung auf?]]></title><description><![CDATA[<p>Hallo,</p>
<p>das ist mein erstes Posting, also bitte Nachsicht mit mir, falls ich irgendwelche alteingesessenen Gebräuche verletzte. Bemühe mich jedenfalls nicht aufzufallen. <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>Zu den Fragen: ich beschäftige mich erst kurz mit C++, aber jetzt ist folgende Ungereimtheit aufgetaucht.</p>
<ol>
<li>
<p>Vererbung wird angepriesen mit der Möglichkeit in einer Basisklasse Grundeigentschaften/-methoden zu anzulegen, die dann die abgeleitete Klasse erbt und verwenden kann. Zusätzlich besteht dann die Möglichkeit in der abgeleiteten Klasse neue Methoden/Eigenschaften zu definieren, um die Funktionalität der Basisklasse speziellen Anforderungen gemäß zu erweiteren.<br />
OK! Verstanden. <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>
</li>
<li>
<p>Wenn ich jedoch über eine Base-Class-Pointer auf die abgeleitete Klasse zugreifen will, so funktioniert das nicht. Ich kann mit einem solchen Pointer nicht auf eine Methode zugreifen (bzw. der Compiler protestiert <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="😉"
    /> ), die ich einer abgeleiteten Klasse zum 1. Mal deklariert/definiert habe. Inzwischen weiß ich auch warum: der Zeigertyp (vom Typ &quot;Basisklasse&quot;) bestimmt welche Methoden ansprechbar sind (eben nur jene in der &quot;Basisklasse&quot;), und nicht der Typ des Objektes, auf das gezeigt wird. Das heißt, grob gesagt, alle Methoden die ich über einen Basisklassen-Zeiger ansprechen will, müssen auch in der Basisklasse vorhanden (definiert) sein.<br />
Ok. Inzwischen auch verstanden. <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>
</li>
</ol>
<p>Was ich allerdings nicht verstehe, welchen Sinn dann dieses Konzept der &quot;Erweiterung der Funktionalität in den abgeleiteten Klassen&quot; haben soll, wenn ich - wie unter 2) - beschrieben alle Funktionen, die in irgendwelchen abgeleiteten Klassen vorkommen, auch in der Basisklasse definieren MUSS, damit's funktioniert. Was ist wenn ich eine Methode in der Basisklasse gar nicht sinnvoll defnieren kann (und sie dementsprechend dort auch nicht brauche), weil irgendwelche Variablen die zur Methodenausführung nötig sind, erst in der abgeleiteten Klasse vorliegen??? Ich habe das so gelöst, indem ich die Methode einfach mit leerem {} Rumpf definiert habe. Aber ist das guter Stil??? Man könnte eine &quot;pure virtual function&quot; draus machen. Wenn ich das aber nicht will, weil die Basisklasse nicht abstrakt sein soll? Außerdem: eine &quot;pure virtual function&quot; müßte dann in allen abgeleiteten Klassen implementiert werden - was, wenn ich diese Funktion aber nur in einer meiner vielen abgeleiteten Klassen tatsächlich brauchen kann?<br />
Oder überhaupt auf das Ansprechen über einen Basisklassenzeiger verzichten??</p>
<p>Ich hoffe ihr habt ein paar Antworten für mich <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="🙂"
    /><br />
Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/177951/hebt-polymorphismus-einige-wirkungsweisen-vorteile-von-vererbung-auf</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 16:31:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/177951.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Apr 2007 16:02:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Hebt Polymorphismus einige Wirkungsweisen&#x2F;Vorteile von Vererbung auf? on Thu, 05 Apr 2007 16:02:41 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>das ist mein erstes Posting, also bitte Nachsicht mit mir, falls ich irgendwelche alteingesessenen Gebräuche verletzte. Bemühe mich jedenfalls nicht aufzufallen. <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>Zu den Fragen: ich beschäftige mich erst kurz mit C++, aber jetzt ist folgende Ungereimtheit aufgetaucht.</p>
<ol>
<li>
<p>Vererbung wird angepriesen mit der Möglichkeit in einer Basisklasse Grundeigentschaften/-methoden zu anzulegen, die dann die abgeleitete Klasse erbt und verwenden kann. Zusätzlich besteht dann die Möglichkeit in der abgeleiteten Klasse neue Methoden/Eigenschaften zu definieren, um die Funktionalität der Basisklasse speziellen Anforderungen gemäß zu erweiteren.<br />
OK! Verstanden. <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>
</li>
<li>
<p>Wenn ich jedoch über eine Base-Class-Pointer auf die abgeleitete Klasse zugreifen will, so funktioniert das nicht. Ich kann mit einem solchen Pointer nicht auf eine Methode zugreifen (bzw. der Compiler protestiert <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="😉"
    /> ), die ich einer abgeleiteten Klasse zum 1. Mal deklariert/definiert habe. Inzwischen weiß ich auch warum: der Zeigertyp (vom Typ &quot;Basisklasse&quot;) bestimmt welche Methoden ansprechbar sind (eben nur jene in der &quot;Basisklasse&quot;), und nicht der Typ des Objektes, auf das gezeigt wird. Das heißt, grob gesagt, alle Methoden die ich über einen Basisklassen-Zeiger ansprechen will, müssen auch in der Basisklasse vorhanden (definiert) sein.<br />
Ok. Inzwischen auch verstanden. <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>
</li>
</ol>
<p>Was ich allerdings nicht verstehe, welchen Sinn dann dieses Konzept der &quot;Erweiterung der Funktionalität in den abgeleiteten Klassen&quot; haben soll, wenn ich - wie unter 2) - beschrieben alle Funktionen, die in irgendwelchen abgeleiteten Klassen vorkommen, auch in der Basisklasse definieren MUSS, damit's funktioniert. Was ist wenn ich eine Methode in der Basisklasse gar nicht sinnvoll defnieren kann (und sie dementsprechend dort auch nicht brauche), weil irgendwelche Variablen die zur Methodenausführung nötig sind, erst in der abgeleiteten Klasse vorliegen??? Ich habe das so gelöst, indem ich die Methode einfach mit leerem {} Rumpf definiert habe. Aber ist das guter Stil??? Man könnte eine &quot;pure virtual function&quot; draus machen. Wenn ich das aber nicht will, weil die Basisklasse nicht abstrakt sein soll? Außerdem: eine &quot;pure virtual function&quot; müßte dann in allen abgeleiteten Klassen implementiert werden - was, wenn ich diese Funktion aber nur in einer meiner vielen abgeleiteten Klassen tatsächlich brauchen kann?<br />
Oder überhaupt auf das Ansprechen über einen Basisklassenzeiger verzichten??</p>
<p>Ich hoffe ihr habt ein paar Antworten für mich <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="🙂"
    /><br />
Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260245</guid><dc:creator><![CDATA[Traisen]]></dc:creator><pubDate>Thu, 05 Apr 2007 16:02:41 GMT</pubDate></item><item><title><![CDATA[Reply to Hebt Polymorphismus einige Wirkungsweisen&#x2F;Vorteile von Vererbung auf? on Thu, 05 Apr 2007 16:19:18 GMT]]></title><description><![CDATA[<p>Du solltest vielleicht ein wenig weiter lesen, bis du zum Schlüsselwort &quot;virtual&quot; kommst. Das bewirkt letztendlich, daß nicht die Methode der Basisklasse, sondern die der abgeleiteten Klasse tatsächlich verwendet wird (das heißt die Basisklasse bestimmt, welche Methoden es gibt (darum kommst du beim Polymorphismus nicht drumherum) und die konkrete abgeleitete Klasse entscheidet, was diese Methoden machen sollen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260254</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 05 Apr 2007 16:19:18 GMT</pubDate></item><item><title><![CDATA[Reply to Hebt Polymorphismus einige Wirkungsweisen&#x2F;Vorteile von Vererbung auf? on Thu, 05 Apr 2007 16:22:00 GMT]]></title><description><![CDATA[<p>Also ich probiers mal, verzeiht, bin selbst nicht so sicher.</p>
<p>Die Basisklasse definiert die grösste Gemeinsamkeit der Schnittstellen.<br />
Wenn du eine Funktion hast, die nicht in allen Subklassen sinnvoll ist, dann gehört sie nicht in die Basisklasse.<br />
Die Möglichkeit leere Funktionen zu implementieren hast du, aber ob dies sinnvoll ist, ist die Frage. Du solltest dann dein Design überdenken.</p>
<p>Beispiel:<br />
Fahrzeuge<br />
-&gt; Fahrrad<br />
-&gt; Auto</p>
<p>Ein Auto braucht natürlich einen Anlasser, das Fahrrad nicht. Aber wenn du in Fahrzeuge eine motor_anlassen(){} definierst, ist das verwirrend, den Fahrräder haben keine Motoren.<br />
Wie machst du das? Du machst eine virtuelle Funktion in Fahrzeug losfahren(){}. In Fahrrad machst du dann weitere Funktionen aufsteigen(), antreten(), die von losfahren() aufgerufen werden, in Auto rufst du Funktionen wie einsteigen(), anschnallen(), motor_anlassen(), gang_einlegen() und gas_geben() auf. (Überspitzes Beispiel, aber ich denke es ist klar was ich meine)<br />
Dann kannst du für alle Fahrzeuge losfahren() aufrufen, und du erhältst jeweils das angemessene Verhalten.</p>
<p>Sonst beschreib mal deinen konkreten Fall, vielleicht kann man dir dann weiterhelfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260255</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Thu, 05 Apr 2007 16:22:00 GMT</pubDate></item><item><title><![CDATA[Reply to Hebt Polymorphismus einige Wirkungsweisen&#x2F;Vorteile von Vererbung auf? on Thu, 05 Apr 2007 16:53:54 GMT]]></title><description><![CDATA[<p>hm... wie nützlich das alles ist, kann man sich am besten an konkreten beispielen klarmachen, meiner meinung nach, deswegen hier n kleiner roman: <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>
<p>Zum beispiel hast du ein kleines nettes spielchen, wo es menschen, hunde, bäume, autos, gebäude und anderes lustiges zeug gibt.</p>
<p>Nun hast du da so eine welt, und fängst an, sie mit objekten zu füllen, die möglichst sinnvoll miteinander interagieren sollen.</p>
<p>Jetzt stellst du fest, dass alle objekte im spiel gewisse gemeinsamkeiten haben: zB sind sie sichtbar. Nun wäre es doof, die funktion, die für das zeichnen verantwortlich sind, bei jedem einzelnen hund und jedem einzelnen stein neuzuimplementieren.</p>
<p>Lösung: Basisklasse. Sagen wir mal &quot;Sichtbar&quot;, mit der methode zeichnen().<br />
Dann überlegst du weiter, und stellst fest, dass du zwar alle objekte siehst, aber nicht alle dich dran hindern, einfach hindurchzulaufen (rauchwolken, staub usw.) Man braucht also objekte, die miteinander kollidieren können, und welche, die es nicht können.</p>
<p>Die kollisionsabfrage will man natürlich nicht für 6784123 verschiedene solide objekte schreiben, deswegen leitet man von der klasse &quot;Sichtbar&quot; die klasse &quot;Solid&quot; ab.</p>
<p>Dann schaut man sich die objekte noch genauer an, und stellt fest, dass sich manche objekte bewegen und manche nicht: &quot;Beweglich&quot; klasse wird von &quot;Solid&quot; abgeleitet. Dann weiter dasselbe spielchen mit &quot;Lebewesen&quot; &quot;Fahrzeug&quot; usw usw usw.</p>
<p>Und letztendlich kanns du objekte diesen ganzen klassen zuordnen:<br />
Wolken: sind nur sichtbar, und brauchen keine weiteren funktionen<br />
Gebäude und Bäume: sind solide objekte. Man kann dagegenrennen und sich wehtun.<br />
Autos: sind fahrzeuge. Die sind beweglich und lassen sich steuern.<br />
Menschen und Hunde: sind lebewesen, auch beweglich wie fahrzeuge, nur deutlich empfindlicher gegen schlechtes wetter.</p>
<p>Das tolle an polymorphie ist, dass du jetzt <strong>jedes</strong> dieser recht unterschiedlicher objekte <strong>einheitlich</strong> ansprechen kannst, und die funktion zeichnen() aufrufen kannst.</p>
<p>Andererseits ist es nicht möglich, für all diese objekte die funktion fahren() aufzurufen, weil die ja für gebäude und bäume wenig sinn macht (du kannst die funktion nicht aufrufen, weil du sie nicht brauchst ). Die kannst du dann aber für alle fahrzeuge aufrufen, und musst dir keine sorgen darum machen, dass jemand versucht, diese undefinierte funktion für einen stein aufzurufen.</p>
<p>Deswegen darf man in der basisklasse auf keinen fall irgendwelche funktionen deklarieren, die nicht für alle abgeleiteten klassen sinn machen,</p>
<blockquote>
<p>was, wenn ich diese Funktion aber nur in einer meiner vielen abgeleiteten Klassen tatsächlich brauchen kann?</p>
</blockquote>
<p>somit hat so eine frage keinen sinn, weil eine basisklasse ja eben dazu da ist, um ein einheitliches interface für alle abgeleiteten klassen zu bieten.</p>
<p>ist n bisschen viel geworden... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
naja, bei mir hat es mit diesem modell am besten geklappt, sich das alles bildlich vorzustellen, hoffentlich hilfts was... <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>
<p>edit: meine fresse, bin ich lahm :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260273</guid><dc:creator><![CDATA[Andrey]]></dc:creator><pubDate>Thu, 05 Apr 2007 16:53:54 GMT</pubDate></item><item><title><![CDATA[Reply to Hebt Polymorphismus einige Wirkungsweisen&#x2F;Vorteile von Vererbung auf? on Thu, 05 Apr 2007 17:58:34 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>... (das heißt die Basisklasse bestimmt, welche Methoden es gibt (darum kommst du beim Polymorphismus nicht drumherum) und die konkrete abgeleitete Klasse entscheidet, was diese Methoden machen sollen).</p>
</blockquote>
<p>Schluck, das meinte ich.<br />
Am Beispiel von THx:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

class Fahrzeuge
{
    protected:
        int raeder;  

    public:
        Fahrzeuge(int rae):
            raeder(rae)
            {}

        virtual void displayRaeder() const  //kommt in allen Klassen vor
            {cout &lt;&lt;&quot;Fahrzeug/Anzahl: &quot; &lt;&lt; raeder &lt;&lt;\n&quot;;}
};

class Fahrrad:public Fahrzeuge
{
    public:
        Fahrrad(int rae):
            Fahrzeuge(rae)
            {}

        virtual void displayRaeder() const
            {cout &lt;&lt; &quot;Fahrrad/Anzahl: &quot; &lt;&lt; raeder &lt;&lt;&quot;\n&quot;;}

        virtual void makeNoise() const   //Funktion, die allein(!) Fahrrad haben soll
            {cout &lt;&lt; &quot;Klingeling...\n&quot;;}
};
int main()
{

    Fahrrad rad(2);
    rad.makeNoise();
    //1. Möglichkeit funktioniert wie zu erwarten problemlos

    Fahrzeuge *obj=new Fahrrad(2);
    obj-&gt;displayRaeder();  //funktioniert
    obj-&gt;makeNoise();  //funktioniert nicht, COMPILER-FEHLER
    return 0;
}
</code></pre>
<p>Wie gesagt, ich weiß warum /obj-&gt;makeNoise();/ nicht funktioniert, weil der Pointer vom Typ &quot;Fahrzeuge&quot; ist, und allein die Methoden der Fahrzeuge-Klasse angesprochen werden können. Damit es funktioniert, müßte ich die makeNoise()-Methode auch in der Basisklasse definieren, dann wär' sie ja wieder eine Methode der Basisklasse. Aber hier liegt mein Problem. Wenn mein Fahrzeuge-Klasse gar keinen Lärm machen soll und dementsprechend die makeNoise()-Methode dort unbrauchbar ist - was sollte ich als Rumpf ein solchen Methode angeben, außer eben einen leeren??. Wenn ich sie rein virtuell mache: virtual void makeNoise()=0, ok, aber was wenn ich ein Fahrzeuge-Objekt brauche? Oder nicht alle abgeleiteten Klassen die makeNoise() automtisch erben sollen (wie's ja bei rein virtuellen Funktionen der Fall ist, wenn ich das recht verstanden habe).</p>
<p>Darum auch die Überschrift. Der Polymorphismus zwingt mich hier Methoden in der Basisklasse zu &quot;sammeln&quot;, die aber speziell auf die <strong>Anfordernisse ihrer abgeleiteten Klassen</strong> zugeschnitten sind und gar nicht in die Basisklasse passen!</p>
<p>Wie kann die blöde makeNoise() da irgendwie sinnvoll reinbringen, und trotzdem &quot;polymorphisch&quot; zu Werke gehen??</p>
<p>Danke <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1260319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260319</guid><dc:creator><![CDATA[Traisen]]></dc:creator><pubDate>Thu, 05 Apr 2007 17:58:34 GMT</pubDate></item><item><title><![CDATA[Reply to Hebt Polymorphismus einige Wirkungsweisen&#x2F;Vorteile von Vererbung auf? on Thu, 05 Apr 2007 18:15:44 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Da must du wohl an deinem Klassenkonzept selber feilen. Deine Darstellung der Polymorphie ist an sich schon korrekt.<br />
Sollte eine Klasse nicht mit den Methoden der Basisklasse zusammenpassen, stellt sich erstmal die Frage ob diese Klasse überhaupt von der Basisklasse abgeleitet werden soll. Die zweite Frage ist ob zumindestens für Einzelfälle ein entsprechender Downcast sinnvoll ist, um auf spezielle Funktionen implementierender Klassenstufen zuzugreifen. Meistens lassen sich Probleme nur durch ein anderes, meistens komplexeres Klassendesign lösen.</p>
<p>In deinem Konkreten Beispiel wurde ich mich fragen ob wirklich ein Fahrzeug von sich aus Krach macht. Eher nicht, sondern erst wenn es gefahren wird. Deine Basisklasse sollte also anstelle von makeNoise() eine Methode virtuelle Methode drive() haben. Nun kannst du Fahrrad normal implementieren, aber bei Auto in der Implementation der Methode drive() noch die nur in Auto enthaltene Methode makeNoise() aufrufen.</p>
<p>Letzendlich wirst du beim umsetzen solcher realler, weitläufgen Probleme immer an Grenzen stoßen. Jedes Modell der Wirklichkeit muß zwangsläufig nur einen Bruchteil derselben zufrieden geben.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260331</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Thu, 05 Apr 2007 18:15:44 GMT</pubDate></item><item><title><![CDATA[Reply to Hebt Polymorphismus einige Wirkungsweisen&#x2F;Vorteile von Vererbung auf? on Fri, 06 Apr 2007 04:37:32 GMT]]></title><description><![CDATA[<p>Liegt in solchen Fällen nicht meist ein Designfehler vor?</p>
<p>Polyphormismus hat den Zweck, dass du unterschiedliche Objekte gleich behandeln kannst.</p>
<pre><code class="language-cpp">vector&lt;Fahrzeug*&gt; vfz;
vfz.push_back(new Fahrrad);
vfz.push_back(new Auto);
for(size_t i=0;i&lt;vfz.size();++i)
    vfz[i]-&gt;fahren();   //Alle Fahrzeuge können fahren
</code></pre>
<p>Wenn du nun etwas hast, das nur bestimmte abgeleitete Klassen können (wie eben z.B Motor anlassen) dann willst du die ja dann, wann du diese Methode brauchst, gar nicht gleich behandeln. Du könntest ja auch in deiner Autoklasse eine Methode tanken haben, die von einer andern Klasse Tankstelle aufgerufen wird. Aber du willst an Tankstelle ja sicher keine Fahrräder übergeben, also übergibst du ihr auch nur Autos und keine Fahrzeuge (da die Tankstelle ja nicht mit allen Fahrzeugen etwas anfangen kann)</p>
<p>Des weiteren, wie thx schon sagte, kann es ja sein, dass du die neuen Methoden nur in der Basisklasse selbst aufrufst (sie alo private machst)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260453</guid><dc:creator><![CDATA[Shinja]]></dc:creator><pubDate>Fri, 06 Apr 2007 04:37:32 GMT</pubDate></item><item><title><![CDATA[Reply to Hebt Polymorphismus einige Wirkungsweisen&#x2F;Vorteile von Vererbung auf? on Fri, 06 Apr 2007 14:22:53 GMT]]></title><description><![CDATA[<p>Shinja schrieb:</p>
<blockquote>
<p>Liegt in solchen Fällen nicht meist ein Designfehler vor?</p>
<p>Polyphormismus hat den Zweck, dass du unterschiedliche Objekte gleich behandeln kannst.</p>
</blockquote>
<p>Ja, wahrscheinlich. Allerdings fällt mir auch nicht ein wie ich es sonst machen soll.</p>
<p><a href="http://www.bw.fh-deggendorf.de/kurse/cpp/skripten/skript9.pdf" rel="nofollow">Hier die Grafik, die meine Frage auslöste!</a> (Auf Seite 3!)</p>
<p>Wir haben generell die Klasse Konto, davon abgeleitet verschiedene Konten mit Spezialisierungen, zb. das Sparkonto mit einem Zinssatz der dazugehörigen Methode verzinse(). Wenn man normal Objekte der Klassen anlegt, ist das ja kein Problem. Aber wenn ich bei so einem Klassendesign mit Polymorphie arbeiten will [Konto *obj=new Sparkonto(...);] müßte ich die verzinse()-Methode schon in der Basisklasse Konto implementieren. Dort habe ich aber keinen Zinssatz!! (Die Variable wird ja auch erst in der abgeleiteten Klasse eingeführt).</p>
<p>Hat jemand eine Idee, wie man die drei Konten polymorphisch ansprechen kann. Ich hab keine.</p>
<p>Die Methode, die Methoden in der Basisklasse zu implementieren, und dann aus den abgeleiteten Klassen heraus aufzurufen (wie hier von einigen vorgeschlagen), funktioniert auch nicht. Dann regte sich der Compiler auf, daß die AUFRUFER-Methoden nicht in der Basisklasse implementiert sind. (&quot;Mehtod xy is not a member of class z(=Basisklass)&quot;)</p>
<p>Wenn jemandem noch was einfällt, bitte melden. Bin dem Wahnsinn nahe. <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>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260658</guid><dc:creator><![CDATA[Traisen]]></dc:creator><pubDate>Fri, 06 Apr 2007 14:22:53 GMT</pubDate></item><item><title><![CDATA[Reply to Hebt Polymorphismus einige Wirkungsweisen&#x2F;Vorteile von Vererbung auf? on Fri, 06 Apr 2007 14:50:16 GMT]]></title><description><![CDATA[<p>Du nutzt halt die Polymorphie nur solange es ums einzahlen/auszahlen geht (quasi &quot;Bankoperation des Kunden&quot; oder so.</p>
<p>Sobald dann die Zinsen an die Reihe kommen nutzt du Polymorphie nicht mehr. Wenn es in manchen Konten keine Verzinsung gibt wäre das ja auch sinnlos. Du würdest ja dann für nicht verzinsbare Konten Zinsen berechnen wollen.</p>
<p>Also wir nehmen mal an du hast alle Konten in einem std::vector&lt;Konto&gt; gespeichert. Da können also Sparkonten Girokonten usw drin sein. Willst du jetzt für ein Girokonto verzinsen aufrufen? Nein willst du nicht, weil ein Giro Konto keinen Zinsen kennt. Also wirst du die Konten sowieso nicht gleich behandeln in diesem Fall und eben keinen Polyphormismus nutzen.</p>
<p>(Sollte es halt jetzt wirklich sooo sehr stören dann setzt du eben eine virtuelle Methode verzinsen in die Basisklasse die dann einfach nichts macht, auszer in der Klasse Sparkonto, dann funktionnierts)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260678</guid><dc:creator><![CDATA[Shinja]]></dc:creator><pubDate>Fri, 06 Apr 2007 14:50:16 GMT</pubDate></item></channel></rss>