<?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[virtual member Funktion wird nicht aufgerufen]]></title><description><![CDATA[<p>Im folgenden Beispiel wird nur die Funktion der Basisklasse nicht die der Überladenen Klasse aufgerufen (hier die Funktion length()) obwohl ich sie virtual deklariert habe.</p>
<p>Ich habe folgende Klasse:</p>
<pre><code class="language-cpp">class ABCD
{
public:
    // Constructors
    ABCD();
    ABCD(double A, double B, double C, double D);
...
     virtual double length();
};

double ABCD::length()
{
    return 0;
}
</code></pre>
<p>und diese Klasse die von ABCD ableitet:</p>
<pre><code class="language-cpp">class Space : public ABCD
{
public:
    Space();
    Space(double distance);

    void setDistance(double distance);
    double distance();
    double length();

private:
    double m_distance;
};

double Space::length()
{
    return distance();
}
</code></pre>
<p>ich füge nun diese Klassen in einen vector ein:</p>
<pre><code class="language-cpp">propagation-&gt;addMatrix(Lens(focalLenght));
    propagation-&gt;addMatrix(Space(distance));

void BeamPropagation::addMatrix(const ABCD &amp; abcd)
{
    d-&gt;matrixList.push_back(abcd);
}
</code></pre>
<p>der die Basisklassen entgegennimmt.</p>
<p>Wenn ich nun die Länge der enthaltenen Matrizen aufrufe</p>
<pre><code class="language-cpp">double BeamPropagation::zAxisSize(size_t elements)
{
    double size = 0;
    for (size_t i = 0; i &lt; elements; ++i)
    {
        size += d-&gt;matrixList.at(i).length();
    }
    return size;
}
</code></pre>
<p>dann wird immer length() von ABCD aufgerufen - was nicht das ist was ich möchte.</p>
<p>Was aber mache ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/273426/virtual-member-funktion-wird-nicht-aufgerufen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 05:12:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/273426.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 Sep 2010 06:41:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to virtual member Funktion wird nicht aufgerufen on Tue, 07 Sep 2010 06:50:45 GMT]]></title><description><![CDATA[<p>Im folgenden Beispiel wird nur die Funktion der Basisklasse nicht die der Überladenen Klasse aufgerufen (hier die Funktion length()) obwohl ich sie virtual deklariert habe.</p>
<p>Ich habe folgende Klasse:</p>
<pre><code class="language-cpp">class ABCD
{
public:
    // Constructors
    ABCD();
    ABCD(double A, double B, double C, double D);
...
     virtual double length();
};

double ABCD::length()
{
    return 0;
}
</code></pre>
<p>und diese Klasse die von ABCD ableitet:</p>
<pre><code class="language-cpp">class Space : public ABCD
{
public:
    Space();
    Space(double distance);

    void setDistance(double distance);
    double distance();
    double length();

private:
    double m_distance;
};

double Space::length()
{
    return distance();
}
</code></pre>
<p>ich füge nun diese Klassen in einen vector ein:</p>
<pre><code class="language-cpp">propagation-&gt;addMatrix(Lens(focalLenght));
    propagation-&gt;addMatrix(Space(distance));

void BeamPropagation::addMatrix(const ABCD &amp; abcd)
{
    d-&gt;matrixList.push_back(abcd);
}
</code></pre>
<p>der die Basisklassen entgegennimmt.</p>
<p>Wenn ich nun die Länge der enthaltenen Matrizen aufrufe</p>
<pre><code class="language-cpp">double BeamPropagation::zAxisSize(size_t elements)
{
    double size = 0;
    for (size_t i = 0; i &lt; elements; ++i)
    {
        size += d-&gt;matrixList.at(i).length();
    }
    return size;
}
</code></pre>
<p>dann wird immer length() von ABCD aufgerufen - was nicht das ist was ich möchte.</p>
<p>Was aber mache ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1949074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1949074</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Tue, 07 Sep 2010 06:50:45 GMT</pubDate></item><item><title><![CDATA[Reply to virtual member Funktion wird nicht aufgerufen on Tue, 07 Sep 2010 06:47:56 GMT]]></title><description><![CDATA[<p>Was ist denn matrixList? Ein vector&lt;ABCD&gt;? Dann sind da auch nur ABCDs drin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1949078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1949078</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Tue, 07 Sep 2010 06:47:56 GMT</pubDate></item><item><title><![CDATA[Reply to virtual member Funktion wird nicht aufgerufen on Tue, 07 Sep 2010 06:52:21 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>Was ist denn matrixList? Ein vector&lt;ABCD&gt;? Dann sind da auch nur ABCDs drin.</p>
</blockquote>
<p>Ja das ist ein vector&lt;ABCD&gt; matrixList;</p>
<p>Würde das ganze funktionieren wenn ich es als</p>
<pre><code class="language-cpp">vector&lt;ABCD*&gt; matrixList;
</code></pre>
<p>deklarieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1949083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1949083</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Tue, 07 Sep 2010 06:52:21 GMT</pubDate></item><item><title><![CDATA[Reply to virtual member Funktion wird nicht aufgerufen on Tue, 07 Sep 2010 07:02:37 GMT]]></title><description><![CDATA[<p>pospiech schrieb:</p>
<blockquote>
<p>Ja das ist ein vector&lt;ABCD&gt; matrixList;</p>
</blockquote>
<p>Dann wird beim Einfügen alles abgeschnitten, was nicht ABCD ist.</p>
<p>pospiech schrieb:</p>
<blockquote>
<p>Würde das ganze funktionieren wenn ich es als</p>
<pre><code class="language-cpp">vector&lt;ABCD*&gt; matrixList;
</code></pre>
<p>deklarieren?</p>
</blockquote>
<p>Benutz besser Smartpointer oder einen speziellen Zeiger-Container.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1949088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1949088</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Tue, 07 Sep 2010 07:02:37 GMT</pubDate></item><item><title><![CDATA[Reply to virtual member Funktion wird nicht aufgerufen on Tue, 07 Sep 2010 07:05:09 GMT]]></title><description><![CDATA[<blockquote>
<p>Ja das ist ein vector&lt;ABCD&gt; matrixList;</p>
</blockquote>
<p>*seufz*</p>
<p>Gewöhne Dir an, polymorphe Basisklassen abstrakt zu machen. Damit kannst Du viele solche Fehler ausschließen.</p>
<blockquote>
<p>vector&lt;ABCD*&gt; matrixList; // ?</p>
</blockquote>
<p>Brauchst Du wirklich hier polymorphe Klassen? (Denk nochmal über Dein Design nach) Musst Du sie wirklich in einem Container speichern, der die konkreten Typen nicht kennt? Wenn Du beides mit ja beantwortest, ist vielleicht ein boost::ptr_vector sehr nützlich. Oder vector&lt;shared_ptr&lt;ABCD&gt; &gt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1949090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1949090</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 07 Sep 2010 07:05:09 GMT</pubDate></item><item><title><![CDATA[Reply to virtual member Funktion wird nicht aufgerufen on Tue, 07 Sep 2010 07:27:46 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Wenn Du beides mit ja beantwortest, ist vielleicht ein boost::ptr_vector sehr nützlich. Oder vector&lt;shared_ptr&lt;ABCD&gt; &gt;.</p>
</blockquote>
<p>Hier möchte ich noch eines hinzufügen:</p>
<p>Falls der Container die Elemente &quot;besitzt&quot; (Mit dem löschen des Containers sollen die Elemente auch gelöscht werden), würde ich zum boost::ptr_vector greifen, und nur wenn dies nicht der Fall ist zu der letzteren Version (shared_ptr ist &quot;teurer&quot;, und trotz seines Nutzens sollte man ihn daher mit Bedacht einsetzen - was nicht heißt das man ich gänzlich meiden soll).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1949100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1949100</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 07 Sep 2010 07:27:46 GMT</pubDate></item></channel></rss>