<?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[Polymorphie-Probleme]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Abstrakte Basisklasse:</p>
<pre><code class="language-cpp">class BaseCell
{
public:
	vector&lt;BaseCell*&gt; *v;
	BaseCell () : v(NULL) {}
	virtual void add ( BaseCell* )=0;
};
</code></pre>
<p>und zwei Abgeleitete Klassen, SpecialCellA und SpecialCellB, die im Wesentlichen gleich aussehen:</p>
<pre><code class="language-cpp">class SpecialCellA : public BaseCell
{
public:
	void add (BaseCell* ptr)
	{
		if (v==NULL)
			v = new vector&lt;BaseCell*&gt;;
                if ( BaseCell ist Zeiger auf SpecialCellA )
                        for (int i=0; i &lt; ptr-&gt;v-&gt;length() ; i++)
                                add( ptr-&gt;(*v)[i] );

                else
		        v-&gt;push_back(ptr);

	}
};
</code></pre>
<p>(SpecialCellB ebenso)</p>
<p>Ich möchte, dass die Methode SpecialCellA::add() SpecialCellA-Objekte elementweise und alle anderen als Zeiger hinzufügt (dabei dreht sich die Methode add() nicht im Kreis, weil alle Objekte auf der untersten Ebene aus Objekten der Klasse SpecialCellC bestehen werden, die sich nicht weiter zerlegen lässt).<br />
Mein Programm müsste also entscheiden können, welchen Typ das Objekt hat, das hinter dem Basisklassenzeiger steht.</p>
<p>Mir fällt dazu nur ein Typfeld oder etwas in der Art mit einer Fallunterscheidung ein, aber genau das soll die Polymorphie ja verhindern!<br />
Am liebsten wären mir natürlich zwei seperate Methoden, eine für jeden Fall.</p>
<p>Ich hoffe, jemand hat eine Idee, und bedanke mich fürs Lesen,</p>
<p>Morph</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/149458/polymorphie-probleme</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 06:38:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/149458.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Jun 2006 10:19:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Polymorphie-Probleme on Tue, 06 Jun 2006 10:19:54 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Abstrakte Basisklasse:</p>
<pre><code class="language-cpp">class BaseCell
{
public:
	vector&lt;BaseCell*&gt; *v;
	BaseCell () : v(NULL) {}
	virtual void add ( BaseCell* )=0;
};
</code></pre>
<p>und zwei Abgeleitete Klassen, SpecialCellA und SpecialCellB, die im Wesentlichen gleich aussehen:</p>
<pre><code class="language-cpp">class SpecialCellA : public BaseCell
{
public:
	void add (BaseCell* ptr)
	{
		if (v==NULL)
			v = new vector&lt;BaseCell*&gt;;
                if ( BaseCell ist Zeiger auf SpecialCellA )
                        for (int i=0; i &lt; ptr-&gt;v-&gt;length() ; i++)
                                add( ptr-&gt;(*v)[i] );

                else
		        v-&gt;push_back(ptr);

	}
};
</code></pre>
<p>(SpecialCellB ebenso)</p>
<p>Ich möchte, dass die Methode SpecialCellA::add() SpecialCellA-Objekte elementweise und alle anderen als Zeiger hinzufügt (dabei dreht sich die Methode add() nicht im Kreis, weil alle Objekte auf der untersten Ebene aus Objekten der Klasse SpecialCellC bestehen werden, die sich nicht weiter zerlegen lässt).<br />
Mein Programm müsste also entscheiden können, welchen Typ das Objekt hat, das hinter dem Basisklassenzeiger steht.</p>
<p>Mir fällt dazu nur ein Typfeld oder etwas in der Art mit einer Fallunterscheidung ein, aber genau das soll die Polymorphie ja verhindern!<br />
Am liebsten wären mir natürlich zwei seperate Methoden, eine für jeden Fall.</p>
<p>Ich hoffe, jemand hat eine Idee, und bedanke mich fürs Lesen,</p>
<p>Morph</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1072334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1072334</guid><dc:creator><![CDATA[Morph01]]></dc:creator><pubDate>Tue, 06 Jun 2006 10:19:54 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie-Probleme on Tue, 06 Jun 2006 10:24:52 GMT]]></title><description><![CDATA[<p>In deinem Fall dürfte ein dynamic_cast ausreichen:</p>
<pre><code class="language-cpp">if(dynamic_cast&lt;SpecialCellA*&gt;(ptr) != NULL)
{
  kopiere CellA-Objekt
}
else
{
  füge sonstiges Objekt ein
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1072339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1072339</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 06 Jun 2006 10:24:52 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie-Probleme on Tue, 06 Jun 2006 10:39:15 GMT]]></title><description><![CDATA[<p>Basisklasse:</p>
<pre><code class="language-cpp">class SpecialCellA;
class SpecialCellB;

class BaseCell
{
protected:

    virtual void addMeTo ( SpecialCellA * Cell ) = 0;

    virtual void addMeTo ( SpecialCellB * Cell ) = 0;

public:
    vector&lt;BaseCell*&gt; *v;
    BaseCell () : v(NULL) {}
    virtual void add ( BaseCell* )=0;
};
</code></pre>
<p>Abgeleitete Klasse:</p>
<pre><code class="language-cpp">class SpecialCellA : public BaseCell
{
    virtual void addMeTo ( SpecialCellA * Cell )
    {
        if (v)
            for (int i=0; i &lt; v-&gt;length() ; i++)
                Cell-&gt;add( (*v)[i] );
    }

    virtual void addMeTo ( SpecialCellB * Cell )
    {
        if (v)
            Cell-&gt;v-&gt;push_back(this);
    }

public:
    void add (BaseCell* ptr)
    {
        if (v==NULL)
            v = new vector&lt;BaseCell*&gt;;

        Ptr-&gt;addMeTo (this);                   
    }
};
</code></pre>
<p>Alles ungetestet, Benutzung auf eigene Verantwortung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1072347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1072347</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Tue, 06 Jun 2006 10:39:15 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie-Probleme on Tue, 06 Jun 2006 10:44:08 GMT]]></title><description><![CDATA[<p>Hallo Morph01,</p>
<p>was heißt bei dir elementweise hinzufügen. Sprich, was willst Du mit SpecialCellA anders machen, Du kannst die Objekte aller von BaseCell abgeleiteten Klassen deinem vector&lt;BaseCell*&gt; v hinzufügen. (Warum eigentlich *v ?)</p>
<p>Wenn Du die Klassen unerschiedlich behandeln willst, implemtier das auch in der entsprechenden Unterklasse. Also z.B.</p>
<pre><code class="language-cpp">class BaseCell{
public:
   ....
   virtual void add(BaseCell*){
        ptr-&gt;addMe(this);
   };
   virtual void addMe(BaseCell*)=0;
   virtual void elementAdd(BaseCell*)=0;
   virtual void zeigerAdd(BaseCell*)=0;
}
class SpecialCellA: public BaseCell
{
public:
    ...
    void elementAdd (BaseCell* ptr)
    {
        //ptr wird elemetweise hinzugefügt. 
    }
    void zeigerAdd (BaseCell* ptr)
    {
        //ptr per Zeiger hinzugefügt. 
    }
    void addMe (BaseCell* ptr)
    {
        // Ich bin vom Typ A und möchte elementweise hinzugefügt werden:
         ptr-&gt;elementAdd(*this)
    }
};
class SpecialCellB{
public:
   ....
   void addMe (BaseCell* ptr)
    {
        // Ich bin vom Typ B und möchte per zeiger hinzugefügt werden:
         ptr-&gt;zeigerAdd(*this)
    }
}
</code></pre>
<p>Wahrscheinlich brauchst Du elementAdd und zeigerAdd gar nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1072350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1072350</guid><dc:creator><![CDATA[DJohn]]></dc:creator><pubDate>Tue, 06 Jun 2006 10:44:08 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphie-Probleme on Tue, 06 Jun 2006 11:40:11 GMT]]></title><description><![CDATA[<p>Hmm, hab mich wohl mit &quot;SpecialCellB ebenso&quot; etwas ungenau ausgedrückt: Ich möchte, dass SpecialCellB::add() Zeiger auf SpecialCellA-Objekte als Zeiger und SpecialCellB-Objekte Elementweise hinzufügt (also genau umgekehrt).</p>
<p>DJohn, dein Vorschlag tut das ja nicht, sondern fügt SpecialCellB-Objekte IMMER Als Zeiger hinzu, das will ich aber nicht.</p>
<p>Z2, ich hab deine Lösung ausprobiert, funktioniert gut, vielen Dank.<br />
CStoll's Lösung mit dem dynamic_cast klingt auch viel versprechend, ich guck mal, welche ich nehme.</p>
<p>Warum ich das ganze überhaupt machen will? Ich möchte eine Klasse schreiben, mit der man mathematische Terme darstellen kann. Dafür schreibe ich Klassen Summe, Produkt und Pbo (Primzahl-Basiertes Objekt, d.h. Potenzen,Wurzeln und das additiv Inverse einer Primzahl). Da nun aber z.B. ein Produkt sowohl weitere Produkte (die einfach aufgelöst werden können) als auch Summen (die mit dem Distributivgesetz aufgelöst werden können) enthält, kam ich auf die Idee mit der virtuellen Basisklasse.<br />
Mein Ziel ist es, eine exakte Darstellung reeller Zahlen zu schaffen (sodass man z.b. 1+3*sqrt(2) als reelle Zahl speichern kann).</p>
<p>Wünscht mir Glück! <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>Also, nochmal vielen Dank an alle, ich denke, dass mein Problem jetzt gelöst ist,</p>
<p>Morph</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1072404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1072404</guid><dc:creator><![CDATA[Morph01]]></dc:creator><pubDate>Tue, 06 Jun 2006 11:40:11 GMT</pubDate></item></channel></rss>