<?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[Probleme mit Vererbung und Typkonvertierungen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgendes Problem. Ich habe eine abstrakte Klasse und 2, die davon erben. In einer map sind diese geerbeten Klassen instanziiert (gemischt und doppelt). nun möchte ich eine Funktion schaffen, die mir immer den richtigen Pointer zurückgibt, da die 2 Klassen unterschiedliche Funktionen aufweisen und nicht durch die abstrakte Klasse zu vereinen sind. Ich denk im Code wirds etwas ersichtlicher:</p>
<pre><code class="language-cpp">class Abstrakt{};
class B : Abstrakt{ void funktionB();};
class C : Abstrakt{ void funktionC();};

class Singleton
{
   map&lt;int,Absrakt*&gt; myMap;
   Abstrakt* getObject(int);
}

//In Other.cpp
//hier ist aber sicher, dass es die Klasse B ist
getSingleton()-&gt;getObject(2)-&gt;funktionB();
</code></pre>
<p>Vielleicht geht das ja mit nem template oder so, aber da hab ich leider keine Ahnung.</p>
<p>Kann mir jemand helfen?</p>
<p>Gruß robb3n</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246688/probleme-mit-vererbung-und-typkonvertierungen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 18:31:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246688.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 31 Jul 2009 11:00:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit Vererbung und Typkonvertierungen on Fri, 31 Jul 2009 11:00:05 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgendes Problem. Ich habe eine abstrakte Klasse und 2, die davon erben. In einer map sind diese geerbeten Klassen instanziiert (gemischt und doppelt). nun möchte ich eine Funktion schaffen, die mir immer den richtigen Pointer zurückgibt, da die 2 Klassen unterschiedliche Funktionen aufweisen und nicht durch die abstrakte Klasse zu vereinen sind. Ich denk im Code wirds etwas ersichtlicher:</p>
<pre><code class="language-cpp">class Abstrakt{};
class B : Abstrakt{ void funktionB();};
class C : Abstrakt{ void funktionC();};

class Singleton
{
   map&lt;int,Absrakt*&gt; myMap;
   Abstrakt* getObject(int);
}

//In Other.cpp
//hier ist aber sicher, dass es die Klasse B ist
getSingleton()-&gt;getObject(2)-&gt;funktionB();
</code></pre>
<p>Vielleicht geht das ja mit nem template oder so, aber da hab ich leider keine Ahnung.</p>
<p>Kann mir jemand helfen?</p>
<p>Gruß robb3n</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752871</guid><dc:creator><![CDATA[robb3n]]></dc:creator><pubDate>Fri, 31 Jul 2009 11:00:05 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung und Typkonvertierungen on Fri, 31 Jul 2009 11:15:48 GMT]]></title><description><![CDATA[<p>Wenn die beiden Klassen sich nicht durch eine abstrakte Klasse vereinen lassen, wieso versuchst Du es dann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752876</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 31 Jul 2009 11:15:48 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung und Typkonvertierungen on Fri, 31 Jul 2009 11:59:40 GMT]]></title><description><![CDATA[<p>Du benutzt hier Abstract*, die keine Schnittstellen für abgeleitete Klassen bieten kann.<br />
Insofern wirst du nicht auf funkB oder funkC zugreifen können, da fehlt dann vorher nen DownCast, aber hierfür musst du auch ermitteln, wer denn wirklich in Abstract* drin steckt.</p>
<p>Was versuchst du genau abzubilden/modellieren ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752902</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 31 Jul 2009 11:59:40 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung und Typkonvertierungen on Sun, 02 Aug 2009 08:01:58 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Wenn die beiden Klassen sich nicht durch eine abstrakte Klasse vereinen lassen, wieso versuchst Du es dann?</p>
</blockquote>
<p>Ich benötige eine Basis, auf der ich die verwaltenden Funktionen konstruieren kann. Sie besitzt Basisfunktionalität, die alle Subklassen besitzen müssen. Erweiterungen sind dann subklassenspezifisch, sodass diese nicht vorher für alle Klassen in der abstrakten Klasse definiert werden können.</p>
<p>KasF schrieb:</p>
<blockquote>
<p>aber hierfür musst du auch ermitteln, wer denn wirklich in Abstract* drin steckt.</p>
</blockquote>
<p>Das ist kein Problem, dafür gibt es eine Funktionalität in der abstrakten Klasse von der Art int Abstrakt::getTyp()</p>
<p>Als sehr aufwendige aber funktionierende Lösung wäre folgendes:</p>
<pre><code class="language-cpp">//in Other.cpp
switch(getSingleton()-&gt;getObject(2)-&gt;getTyp()){
  case 0: //für bspw class B
    dynamic_cast&lt;B*&gt;(getSingleton()-&gt;getObject(2))-&gt;funktionB();
    break;
  case 1: //für class C
    dynamic_cast&lt;C*&gt;(getSingleton()-&gt;getObject(2))-&gt;funktionC();
    break;
</code></pre>
<p>Aber da an vielen verschieden stellen ein solchen Konstrukt von Nöten wäre, sollte das nicht der Weg sein, den ich gehen will.<br />
Edit: Außerdem müsste ich dann auch alle bekannten Klassen inkludieren, da ich in Zeile 4 und 7 explizit die Klassen nennen.</p>
<p>KasF schrieb:</p>
<blockquote>
<p>Was versuchst du genau abzubilden/modellieren ?</p>
</blockquote>
<p>Es gibt ja zum Thema abstrakte Klasse und Vererbung immer das schöne Beispiel mit Fahrzeug als abstrakte Klasse und den erbenden Klassen Auto und Flugzeug. Dann wird immer von Fahrzeug::bewegen() gesprochen und man solle doch in Auto::bewegen() &quot;fahren()&quot; und in Flugzeug::bewegen() ein &quot;fliegen()&quot; einsetzen. Doch mein Problem könnte in diesem Beispiel folgendes sein: Das Auto soll den linken Blinker setzen und das Flugzeug meinetwegen das Fahrwerk einziehen. Das sind Funktionen die nicht in Fahrzeug gehören und da auch keinen Sinn ergeben würden.</p>
<p>Ich hoffe, ich konnte das jetzt verständlich darstellen?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753870</guid><dc:creator><![CDATA[robb3n]]></dc:creator><pubDate>Sun, 02 Aug 2009 08:01:58 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung und Typkonvertierungen on Sun, 02 Aug 2009 08:21:29 GMT]]></title><description><![CDATA[<p>Das sind aber zwei verschiedene Funktionalitäten.<br />
Ein Flugzeug wenn die Steuerklappen setzt dann fliegt es eine Kurve. Ein Auto kann das auch, Lenkrad drehen. Dies liese sich vereinen mit einer Basisfunktion</p>
<pre><code class="language-cpp">void driveTo( Direction dir );
</code></pre>
<p>Direction (enum) definiert nun Right, Left, Top, Bottom. Bei Top und Bottom wird halt dann beim Auto nix machen/Meldung ausgeben/Exception werfen.</p>
<p>Blinken ist da fehl am Platz. Das ist etwas spezielleres, da das nicht jedes Fahrzeug kann, sollte das nicht in der Basisklasse vorhanden sein.</p>
<p>Bedenke auch, dass man links blinken kann und dann nach rechts fahren <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>Du kannst dir überlegen, ob du noch ne zusätzliche Klasse &quot;Blinkable&quot; (oder &quot;DirectionChangeIndicatable&quot; oder was auch immer, ist ja wurscht) verwendest, die dann Auto, Boot, eben alles was blinken kann aber keine eigene Basisklasse hat, zusätzlich beerben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753880</guid><dc:creator><![CDATA[Autoflieger]]></dc:creator><pubDate>Sun, 02 Aug 2009 08:21:29 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung und Typkonvertierungen on Sun, 02 Aug 2009 09:24:42 GMT]]></title><description><![CDATA[<p>Wie wärs mit dem Visitor Pattern?</p>
<pre><code class="language-cpp">class Abstract;
class B;
class C;

class Visitor {

public: 
   void visit(Abstract &amp;a);
   void visit(B &amp;b);
   void visit(C &amp;c);
}

class Abstract {

public:
   virtual void accept(Visitor &amp;) = 0;
};

class B: public Abstract {

public:
   virtual void accept(Visitor &amp;v) {
      v.visit(*this);
   }
};

class C: public Abstract {

public:
   virtual void accept(Visitor &amp;v) {
      v.visit(*this);
   }
};
</code></pre>
<p>Innerhalb der visit()-Methoden des Visitors kennst du jetzt den wahren Typ des Objekts und kannst spezifische Methoden aufrufen.</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753896</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Sun, 02 Aug 2009 09:24:42 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung und Typkonvertierungen on Sun, 02 Aug 2009 09:47:42 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22102">@robb3n</a>,<br />
Schon mal die Lösung in betracht gezogen, die Klassen in getrennte Container zu speichern? Die Anfänger probieren vielfach zu wenig Container einzusetzen und wollen alles in einen stopfen, dabei ging es genausogut, bzw. deutlich einfacher, mit mehreren Containern.</p>
<p>Aber um dir dabei zu helfen, es über die getrennten Container zu lösen, müsstest du ein paar Schritte zurück gehen und erklären, was genau du tun möchtest.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753904</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 02 Aug 2009 09:47:42 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung und Typkonvertierungen on Mon, 03 Aug 2009 07:52:46 GMT]]></title><description><![CDATA[<p>DStefan schrieb:</p>
<blockquote>
<p>Wie wärs mit dem Visitor Pattern?</p>
</blockquote>
<p>Das sieht ja voll interessant aus. Ich hab mich dann mal weiter in die Richtung informiert, hab allerdings nicht genau verstanden wie ich das dann in der others.cpp einsetzen könnte. Alle Beispiele die ich gefunden habe sind dann einfach alle durchgegangen aber ich möchte ja explizite Funktionen einzelner KLassen aufrufen. Wie würde es bspw aussehen, wenn ich einmal B::functionB1() aufrufen möchte und an einer anderen Stelle B::functionB2()?</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Schon mal die Lösung in betracht gezogen, die Klassen in getrennte Container zu speichern? Die Anfänger probieren vielfach zu wenig Container einzusetzen und wollen alles in einen stopfen, dabei ging es genausogut, bzw. deutlich einfacher, mit mehreren Containern.</p>
</blockquote>
<p>Möglicherweise wäre das sinnvoller, aber ich muss auf dieser Basis aufsetzen, sodass ich aktuell nicht weiter in diese Richtung denken kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754362</guid><dc:creator><![CDATA[robb3n]]></dc:creator><pubDate>Mon, 03 Aug 2009 07:52:46 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung und Typkonvertierungen on Mon, 03 Aug 2009 09:42:17 GMT]]></title><description><![CDATA[<p>Es ist m.A. nach ein Designfehler, Objekte einer Basisklasse in einer map zusammen zu hauen und dann darauf zu bestehen, auf die spezifischen Methoden ein zu gehen. Abstrakt ist nun mal die Schnittstelle, nur über sie solltest du zugreifen können.</p>
<p>Du kannst eine fette Schnittstelle implementieren, d.h. große Funktionalität in die Schnittstelle packen und dann in den Subklassen prüfen, ob diese diese Funktion unterstützen soll. Wegen virtuellen Funktionen und dynamischer Typenüberprüfung wäre das aber recht unperformant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754424</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Mon, 03 Aug 2009 09:42:17 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung und Typkonvertierungen on Mon, 03 Aug 2009 10:45:12 GMT]]></title><description><![CDATA[<p>robb3n schrieb:</p>
<blockquote>
<p>DStefan schrieb:</p>
<blockquote>
<p>Wie wärs mit dem Visitor Pattern?</p>
</blockquote>
<p>Das sieht ja voll interessant aus. Ich hab mich dann mal weiter in die Richtung informiert, hab allerdings nicht genau verstanden wie ich das dann in der others.cpp einsetzen könnte. Alle Beispiele die ich gefunden habe sind dann einfach alle durchgegangen aber ich möchte ja explizite Funktionen einzelner KLassen aufrufen. Wie würde es bspw aussehen, wenn ich einmal B::functionB1() aufrufen möchte und an einer anderen Stelle B::functionB2()?</p>
</blockquote>
<p>Der Trick beim Visitor ist, dass du quasi den eigentlichen Typ &quot;zurück gewinnst&quot;.</p>
<p>In deiner Map hast du Pointer auf die Oberklasse Abstrakt und rufst über diesen Pointer die (rein) virtuelle Methode accept() auf, deren Argument der Visitor ist. Unterklassen überschreiben accept(), so dass du also durch den Aufruf beispielsweise in B::accept() landest.</p>
<p>Dort wird nun Visitor::visit() aufgerufen und übergibt this (das ein Pointer auf B ist). Da der Visitor visit() für alle infrage kommenden Klassen überladen hat, wird nun also Visitor::visit(B <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="😉"
    /> aufgerufen und - voila - du hast dort den korrekten Typ des Objekts. Dort kannst du dann also Methoden aufrufen, die nur B, nicht aber die Oberklasse Abstrakt besitzt.</p>
<pre><code class="language-cpp">class Visitor {

public:
   void visit(Abstrakt *obj) {
      // ...
   }
   void visit(A *obj) {
      obj-&gt;method_of_a();
   }
   void visit(B *obj) {
      obj-&gt;method_of_b();
   }
};
</code></pre>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754446</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Mon, 03 Aug 2009 10:45:12 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung und Typkonvertierungen on Mon, 03 Aug 2009 14:31:51 GMT]]></title><description><![CDATA[<p>DStefan schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class Visitor {

public:
   void visit(Abstrakt *obj) {
      // ...
   }
   void visit(A *obj) {
      obj-&gt;method_of_a();
   }
   void visit(B *obj) {
      obj-&gt;method_of_b();
   }
};
</code></pre>
<p>Stefan.</p>
</blockquote>
<p>Verstanden. Also ruf ich dann sowas auf (im Vergleich zum Code zum Thread-Start):</p>
<pre><code class="language-cpp">// in Others.cpp
Visitor v;
getSingleton()-&gt;getObject(2)-&gt;accept(v); //angenommen das Objekt ist Klasse B

//in Visitor
visit(B &amp;obj)
{
   obj.funktionB1();
}
</code></pre>
<p>Wie verhalte ich mich dann, wenn ich unterschiedliche Funktionen in den Klassen habe. Soll ich dann immer noch ein Integer der Aufgabe übergeben und #defines einsetzen? So wie hier bspw.:</p>
<pre><code class="language-cpp">#define FKT_B1   23
#define FKT_B2   42
// in Others.cpp
Visitor v;
getSingleton()-&gt;getObject(2)-&gt;accept(v,FKT_B1); //angenommen das Objekt ist Klasse B
//...
getSingleton()-&gt;getObject(2)-&gt;accept(v,FKT_B2);

//in Visitor
visit(B &amp;obj, int toDo)
{
   switch(toDo)
   {
      case FKT_B1:
         obj.funktionB1();
         break;
      case FKT_B2:
         obj.funktionB2();
         break;
   }
}
</code></pre>
<p>Gruß robb3n</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754599</guid><dc:creator><![CDATA[robb3n]]></dc:creator><pubDate>Mon, 03 Aug 2009 14:31:51 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung und Typkonvertierungen on Mon, 03 Aug 2009 14:42:09 GMT]]></title><description><![CDATA[<p>robb3n schrieb:</p>
<blockquote>
<p>Wie verhalte ich mich dann, wenn ich unterschiedliche Funktionen in den Klassen habe. Soll ich dann immer noch ein Integer der Aufgabe übergeben und #defines einsetzen? So wie hier bspw.:</p>
<pre><code class="language-cpp">#define FKT_B1   23
#define FKT_B2   42
// in Others.cpp
Visitor v;
getSingleton()-&gt;getObject(2)-&gt;accept(v,FKT_B1); //angenommen das Objekt ist Klasse B
//...
getSingleton()-&gt;getObject(2)-&gt;accept(v,FKT_B2);

//in Visitor
visit(B &amp;obj, int toDo)
{
   switch(toDo)
   {
      case FKT_B1:
         obj.funktionB1();
         break;
      case FKT_B2:
         obj.funktionB2();
         break;
   }
}
</code></pre>
<p>Gruß robb3n</p>
</blockquote>
<p>Nein, das würde ich nicht so machen. Oder wenigstens nur in Ausnahmefällen. Stattdessen würde ich eine abstrakte Visitor-Klasse machen und für die gewünschten Fälle Unterklassen davon. Auf diese Weise macht jede Visitor-Klasse genau einen Job.</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754608</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Mon, 03 Aug 2009 14:42:09 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung und Typkonvertierungen on Thu, 06 Aug 2009 09:59:54 GMT]]></title><description><![CDATA[<p>Vielen Dank für eure tatkräftige Unterstützung.</p>
<p>Besonderer Dank gilt <strong>DStefan</strong> für sein Fachwissen.</p>
<p>greetz robb3n</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756183</guid><dc:creator><![CDATA[robb3n]]></dc:creator><pubDate>Thu, 06 Aug 2009 09:59:54 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Vererbung und Typkonvertierungen on Thu, 06 Aug 2009 18:36:12 GMT]]></title><description><![CDATA[<p>robb3n schrieb:</p>
<blockquote>
<p>Vielen Dank für eure tatkräftige Unterstützung.</p>
<p>Besonderer Dank gilt <strong>DStefan</strong> für sein Fachwissen.</p>
<p>greetz robb3n</p>
</blockquote>
<p>Kommt alles aus diesem Buch:</p>
<p><a href="http://www.amazon.de/Entwurfsmuster-Elemente-wiederverwendbarer-objektorientierter-Software/dp/3827328241/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1249583474&amp;sr=1-1" rel="nofollow">http://www.amazon.de/Entwurfsmuster-Elemente-wiederverwendbarer-objektorientierter-Software/dp/3827328241/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1249583474&amp;sr=1-1</a></p>
<p>Solltest du vielleicht mal lesen.</p>
<p>Aber Vorsicht! Vermutlich wirst du es nicht mehr aus der Hand legen können, bis du damit fertig bist. So ist es mir jedenfalls damals ergangen. <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="😉"
    /> <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>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756573</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Thu, 06 Aug 2009 18:36:12 GMT</pubDate></item></channel></rss>