<?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[frage zu vererbungs-hierarchie ..]]></title><description><![CDATA[<p>hallo allerseits,</p>
<p>ich habe folgendes problem, hoffe jemand hat einen loesungsanstoss parat -&gt;</p>
<p>(aufgelisteter code ist aufs wesentlichste gekuerzt)</p>
<p>ich schreibe eine C++ applikation die eine fremd-library verwendet.<br />
diese library stellt mir folgende klassen zur verfuegung:</p>
<pre><code>class Base
{
};
class SubA : public Base
{
};
class SubB : public Base
{
};
</code></pre>
<p>und folgende Klasse in meiner eigenen Applikation</p>
<pre><code>class Handler
{
  public:
   void DoSomeThing( SubA *pA )
   {
     // hier passieren SubA spezifische Sachen
   }
};
</code></pre>
<p>meine C++ Applikation beinhaltet ferner Datenstrukturen die auf SubA aufbauen wie z.B. eine Liste von SubA Instanzen. Bei Abarbeitung solch einer Liste wird eine Instanz von Handler verwendet und fuer jedes Element ein DoSomeThing(element) aufgerufen.</p>
<p>Nun mein Problem:<br />
Ich moechte das Handler::DoSomeThing auch mit SubB objekten bedienen können.<br />
Also quasi eine weitere methode von der Handler Klasse:</p>
<pre><code>void Handler::DoSomeThing( SubB *pB )
{
// hier passieren SubB spezifische Sachen
}
</code></pre>
<p>Die besagte Listen-Datenstruktur die dann bisher SubA elemente enthielt muesste entsprechend auch SubB elemente erlauben sodass bei jedem Handler::DoSomeThing( ??? ) typabhaengig klar ist welches Handler::DoSomeThing(..) verwendet werden soll.<br />
wie ist sowas moeglich ?</p>
<p>danke vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301410/frage-zu-vererbungs-hierarchie</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 19:25:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301410.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 26 Mar 2012 14:49:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to frage zu vererbungs-hierarchie .. on Mon, 26 Mar 2012 14:49:36 GMT]]></title><description><![CDATA[<p>hallo allerseits,</p>
<p>ich habe folgendes problem, hoffe jemand hat einen loesungsanstoss parat -&gt;</p>
<p>(aufgelisteter code ist aufs wesentlichste gekuerzt)</p>
<p>ich schreibe eine C++ applikation die eine fremd-library verwendet.<br />
diese library stellt mir folgende klassen zur verfuegung:</p>
<pre><code>class Base
{
};
class SubA : public Base
{
};
class SubB : public Base
{
};
</code></pre>
<p>und folgende Klasse in meiner eigenen Applikation</p>
<pre><code>class Handler
{
  public:
   void DoSomeThing( SubA *pA )
   {
     // hier passieren SubA spezifische Sachen
   }
};
</code></pre>
<p>meine C++ Applikation beinhaltet ferner Datenstrukturen die auf SubA aufbauen wie z.B. eine Liste von SubA Instanzen. Bei Abarbeitung solch einer Liste wird eine Instanz von Handler verwendet und fuer jedes Element ein DoSomeThing(element) aufgerufen.</p>
<p>Nun mein Problem:<br />
Ich moechte das Handler::DoSomeThing auch mit SubB objekten bedienen können.<br />
Also quasi eine weitere methode von der Handler Klasse:</p>
<pre><code>void Handler::DoSomeThing( SubB *pB )
{
// hier passieren SubB spezifische Sachen
}
</code></pre>
<p>Die besagte Listen-Datenstruktur die dann bisher SubA elemente enthielt muesste entsprechend auch SubB elemente erlauben sodass bei jedem Handler::DoSomeThing( ??? ) typabhaengig klar ist welches Handler::DoSomeThing(..) verwendet werden soll.<br />
wie ist sowas moeglich ?</p>
<p>danke vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195587</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Mon, 26 Mar 2012 14:49:36 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu vererbungs-hierarchie .. on Mon, 26 Mar 2012 14:56:18 GMT]]></title><description><![CDATA[<p>Ja, das ist möglich, das ist sogar ein ziemlich wichtiges Konzept namens &quot;Polymorphie&quot;. Wenn jedoch die Klassen in der Bibliothek nicht darauf ausgelegt sind, dann geht das grandios schief. Sie müssen mindestens einen virtuellen Destruktor haben (sofern SubA und SubB eigene Member haben, was ich mal annehme, sonst wäre die Hierarchie reichlich sinnlos). Falls sie das nicht haben und du den Code auch nicht reparieren kannst, dann kannst du dir eventuell noch mit Dynamic-Cast-Orgien was zurechtfrickeln, aber das kann ich wirklich nicht empfehlen.</p>
<p>Aber guck dir erst einmal Polymorphie an, dann verstehst du, wovon ich rede.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195593</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 26 Mar 2012 14:56:18 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu vererbungs-hierarchie .. on Tue, 27 Mar 2012 12:51:28 GMT]]></title><description><![CDATA[<p>ok, meine schuld: ich habe das problem nicht ausreichend darstellen koennen.<br />
hoffentlich nehmt ihr mir den zweiten anlauf nicht uebel --&gt;</p>
<p>klar weiss ich was polymorphie ist und wozu es gut ist.<br />
ich denke auch dass sie zur loesung meines problems beitragen kann, jedoch nicht ausschliesslich.</p>
<p>es geht um folgendes:</p>
<p>ich habe eine lineare liste von instanzen einer bestimmten klasse X</p>
<pre><code>std::list&lt;X&gt; myList;
</code></pre>
<p>Die Klasse X wird mir von der Fremd-Library zur Verfuegung gestellt. Genauso auch<br />
eine weitere Klasse Y.<br />
Beide Klassen haben keine direkte Verwandtschaft sondern sind beide Ableitungen einer Basisklasse B:</p>
<pre><code>class B{};
class X : public B {};
class Y : public B {};
</code></pre>
<p>Ich möchte nun in der besagten Listen-Datenstruktur nicht nur X Instanzen sondern auch Y Instanzen abspeichern können. Das würde gehen, falls man sie wie folgt deklariert:</p>
<pre><code>std::list&lt;B&gt; myList;
</code></pre>
<p>Jetzt habe ich das Problem beim Hineinpacken geloest, jedoch muss beim Rausnehmen auch eine Unterscheidungsmoeglichkeit gegeben sein, da ich je nach Typ eine andere Operation auf dem listen-elemen durchfuehren moechte.</p>
<pre><code>class ObjHandler
{
  void DoSomeThingWithObject( B obj )
  {
     // hier festellung was obj eigentlich genau ist ... 
  }
};
</code></pre>
<p>oder aber</p>
<pre><code>class ObjHandler
{
  void DoSomeThingWithObject( X x )
  {
     // X spezifisches hier 
  }
  void DoSomeThingWithObject( Y y )
  {
    // Y spezifisches hier
  }
};
</code></pre>
<p>Klar laesst sich obiges nicht auf anhieb kompilieren aber ich hoffe ich habe mein problem etwas genauer beschreiben koennen.<br />
Ich habe die Vermutung das ein bestimmtes Design Pattern (Visitor) evtl. angewendet werden muesste, bin mir aber nicht ganz sicher.</p>
<p>Vielen Dank vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195838</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Tue, 27 Mar 2012 12:51:28 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu vererbungs-hierarchie .. on Tue, 27 Mar 2012 12:57:55 GMT]]></title><description><![CDATA[<p>Warum nimmst du nicht einfach zwei Listen?<br />
Alternativ könntest du auch ein boost::variant&lt;A, B&gt; in die List packen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195840</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Tue, 27 Mar 2012 12:57:55 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu vererbungs-hierarchie .. on Tue, 27 Mar 2012 12:59:28 GMT]]></title><description><![CDATA[<p>pepe75 schrieb:</p>
<blockquote>
<p>Ich möchte nun in der besagten Listen-Datenstruktur nicht nur X Instanzen sondern auch Y Instanzen abspeichern können. Das würde gehen, falls man sie wie folgt deklariert:</p>
<pre><code>std::list&lt;B&gt; myList;
</code></pre>
</blockquote>
<p>Das würde nicht gehen. Du speicherst so nur Bs keine Xs oder Ys. Der Teil von einem X der kein B ist würde abgeschnitten. Das nennt sich Splicing. Dein Ansatz ist somit technisch falsch und die Probleme die im folgenden noch auftreten stellen sich gar nicht erst.</p>
<p>Was ist denn dein eigentliches Problem? Klassen mit gemeinsamer Basisklasse gemeinsam zu verwalten, geht normalerweise über Basisklassenzeiger. Und um dann mit diesen Zeigern was machen zu können, das nicht nur die Basisklasse betrifft, kann man Polymorphie nutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195843</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 27 Mar 2012 12:59:28 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu vererbungs-hierarchie .. on Tue, 27 Mar 2012 13:21:49 GMT]]></title><description><![CDATA[<p>ja es haette eine liste von basis-klassen zeigern sein muessen, klar.</p>
<p>mein eigentliches problem ist, dass ich die eine liste behalten moechte.<br />
vielleicht doch ein bischen mehr zum kontext:</p>
<p>die software um die es geht, bedient eine 3D Engine und die klassen<br />
X,Y und B sind messages die an die engine geschickt werden.</p>
<p>die software parst hierbei eine xml-datei und erzeugt eine liste von messages die an die engine (spaeter) geschickt werden sollen.</p>
<p>bisher wurden hierbei nur messages vom typ X betrachtet und nun soll auch Y dazukommen, jedoch die listen-struktur nicht zerstoert werden, da weiter teile der software auf dieser struktur aufbauen.</p>
<p>der interessante teil passiert an der stelle, wo ein element rausgenommen und verschickt werden soll. Hier muessen dann naemlich noch auf dem jeweiligen Listen-Element (je nach Typ) bestimmte vorarbeiten vorgenommen werden<br />
(das entspricht ungefaehr der ObjHandler Klasse aus meinem Vorpost und dessen Methode DoSomeThing(..)).</p>
<p>Was mir fehlt ist der geeignete (elegante) Programmier-Formalismus der obiges ermöglicht ohne die listen-struktur aufzubrechen.</p>
<p>vielen dank (auch wenn es immer noch nicht klar sein sollte <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/2195853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195853</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Tue, 27 Mar 2012 13:21:49 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu vererbungs-hierarchie .. on Tue, 27 Mar 2012 14:21:53 GMT]]></title><description><![CDATA[<p>Dann nehm dynamic_cast</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195868</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Tue, 27 Mar 2012 14:21:53 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu vererbungs-hierarchie .. on Tue, 27 Mar 2012 16:12:45 GMT]]></title><description><![CDATA[<p>pyhax schrieb:</p>
<blockquote>
<p>Dann nehm dynamic_cast</p>
</blockquote>
<p>Schlechte Idee.</p>
<p>Das Problem schreit nach virtuellen Methoden.</p>
<pre><code class="language-cpp">struct Base {
  virtual void preprocess() {}
};
struct SubA : Base {
  virtual void preprocess() { doSomethingWithSubA(*this); }
}
</code></pre>
<p>Vorher musst du allerdings das Problem mit dem Splicing in den Griff kriegen. Wenn du C++11 verwenden kannst, nimm eine <code>std::list&lt;std::unique_ptr&lt;Base&gt;&gt;</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195916</guid><dc:creator><![CDATA[lazycoder]]></dc:creator><pubDate>Tue, 27 Mar 2012 16:12:45 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu vererbungs-hierarchie .. on Tue, 27 Mar 2012 17:57:45 GMT]]></title><description><![CDATA[<p>Die Klasse Base kann aber nicht verändert werden, sie wird doch von der Fremdlibrary bereitgestellt, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195955</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Tue, 27 Mar 2012 17:57:45 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu vererbungs-hierarchie .. on Mon, 02 Apr 2012 08:03:13 GMT]]></title><description><![CDATA[<p>zunaechst mal ein grosses danke-schoen fuer die anregungen.</p>
<p>@phyax und @lazycoder:</p>
<p>- die Klassen der zu behandelnden Elemente meiner Listenstruktur kann ich nicht veraendern. lazycoder hat aufgepasst: sind fremd-library klassen.</p>
<p>- was ich allerdings machen kann, ist die Klasse der Instanz zu aendern, die die Elemente bearbeitet. Es muss dort eine Art preprocessing stattfinden und lazycoders ansatz mit den virtuellen methoden fuehrt glaube ich in die richtige richtung. Ich habe das gefuehl, dass hier das Visitor Pattern umgesetzt werden muss. Auf Fallstricke wie das genannte splicing problem etc. muss ich nochmal genauer schauen, denke aber dass es mit virtuellen methoden und der verwendung von boost::shared_ptr&lt;Base&gt; als Elemente meiner Liste gehen muesste (!?)</p>
<p>Vielen Dank, ein hoch auf das Forum <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197847</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Mon, 02 Apr 2012 08:03:13 GMT</pubDate></item></channel></rss>