<?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[Vererbungsproblem]]></title><description><![CDATA[<p>So siehts derzeit aus:</p>
<pre><code>+---------+
           |    A    |
           +---------+
                ^
                |
     +----------+----------+
     |                     |
+---------+           +---------+
|    B    |           |    C    |
+---------+           +---------+
     ^                     ^
     |     +---------+     |
     |     |    D    |     |
     |     +---------+     |
     |          ^          |
     |  +-------+-------+  |
     |  |               |  |
+---------+           +---------+
|  BImpl  |           |  CImpl  |
+---------+           +---------+
</code></pre>
<p>Also <code>B</code> und <code>C</code> sind von <code>A</code> abgeleitet, die beide in <code>BImpl</code> bzw in <code>CImpl</code> spezialisiert sind. <code>B</code> und <code>C</code> sind generierte Klassen, daran kann ich nichts ändern.<br />
Jetzt brauche ich eine gemeinsame Basisklasse <code>D</code> , die ich statt einer spezialisierten Klasse verwenden will (zwecks Polymorphie).<br />
Das Problem ist, ich hab jetzt zwar eine Variable vom Typ <code>D</code> (die entweder ein <code>BImpl</code> - oder <code>CImpl</code> -Objekt enthält), andere Methoden erfordern aber ein Objekt vom Typ <code>A</code> . Und davon kann ich ja in meiner Basisklasse nicht ableiten, weil der Compiler dann logischerweise eine mehrdeutige Ableitung entdeckt...</p>
<p>Ich hoffe, der Text war halbwegs verständlich</p>
<p>Kurz: Ich hab eine Variable vom Typ <code>D</code> , brauch aber eine Variable vom Typ <code>A</code></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/254722/vererbungsproblem</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 16:46:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/254722.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 20 Nov 2009 08:21:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbungsproblem on Fri, 20 Nov 2009 08:21:03 GMT]]></title><description><![CDATA[<p>So siehts derzeit aus:</p>
<pre><code>+---------+
           |    A    |
           +---------+
                ^
                |
     +----------+----------+
     |                     |
+---------+           +---------+
|    B    |           |    C    |
+---------+           +---------+
     ^                     ^
     |     +---------+     |
     |     |    D    |     |
     |     +---------+     |
     |          ^          |
     |  +-------+-------+  |
     |  |               |  |
+---------+           +---------+
|  BImpl  |           |  CImpl  |
+---------+           +---------+
</code></pre>
<p>Also <code>B</code> und <code>C</code> sind von <code>A</code> abgeleitet, die beide in <code>BImpl</code> bzw in <code>CImpl</code> spezialisiert sind. <code>B</code> und <code>C</code> sind generierte Klassen, daran kann ich nichts ändern.<br />
Jetzt brauche ich eine gemeinsame Basisklasse <code>D</code> , die ich statt einer spezialisierten Klasse verwenden will (zwecks Polymorphie).<br />
Das Problem ist, ich hab jetzt zwar eine Variable vom Typ <code>D</code> (die entweder ein <code>BImpl</code> - oder <code>CImpl</code> -Objekt enthält), andere Methoden erfordern aber ein Objekt vom Typ <code>A</code> . Und davon kann ich ja in meiner Basisklasse nicht ableiten, weil der Compiler dann logischerweise eine mehrdeutige Ableitung entdeckt...</p>
<p>Ich hoffe, der Text war halbwegs verständlich</p>
<p>Kurz: Ich hab eine Variable vom Typ <code>D</code> , brauch aber eine Variable vom Typ <code>A</code></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810817</guid><dc:creator><![CDATA[zwutz]]></dc:creator><pubDate>Fri, 20 Nov 2009 08:21:03 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsproblem on Fri, 20 Nov 2009 10:29:37 GMT]]></title><description><![CDATA[<p>Schon dynamic_cast probiert?</p>
<pre><code class="language-cpp">D* foo = new BImpl();

A* bar = dynamic_cast&lt;A*&gt;(foo);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1810895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810895</guid><dc:creator><![CDATA[C Newbie]]></dc:creator><pubDate>Fri, 20 Nov 2009 10:29:37 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsproblem on Fri, 20 Nov 2009 10:33:10 GMT]]></title><description><![CDATA[<p>So wie es das Bild zeigt geht das nicht. D und A haben nichts miteinander zu tun. Folglich kann ein D auch kein A sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810900</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 20 Nov 2009 10:33:10 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsproblem on Fri, 20 Nov 2009 10:36:53 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/869">@C</a> Newbie: genau das wollte ich eigentlich vermeiden</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a>: schön, dass du wiederholst, was ich bereits weiß. Wenn es gehen würde, würde ich auch nicht nach einer Alternativlösung fragen <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/1810903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810903</guid><dc:creator><![CDATA[zwutz]]></dc:creator><pubDate>Fri, 20 Nov 2009 10:36:53 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsproblem on Fri, 20 Nov 2009 10:42:17 GMT]]></title><description><![CDATA[<p>zwutz schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/869">@C</a> Newbie: genau das wollte ich eigentlich vermeiden</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a>: schön, dass du wiederholst, was ich bereits weiß. Wenn es gehen würde, würde ich auch nicht nach einer Alternativlösung fragen <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>
</blockquote>
<p>Gefragt hast Du gar nichts. Und dass Du weißt, dass man D nicht in A überführen kann, hast Du auch nicht geschrieben. Der dynamic_cast ist hier tatsächlich zu vermeiden, weil er falsch ist.<br />
Wenn B und C generiert sind, ist dann auch A generiert?<br />
Ansonsten: Mache es wie gezeigt, nur dass BImpl und CImpl D als Aggregat benutzen und nicht davon erben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810911</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 20 Nov 2009 10:42:17 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsproblem on Fri, 20 Nov 2009 10:47:07 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Ansonsten: Mache es wie gezeigt, nur dass BImpl und CImpl D als Aggregat benutzen und nicht davon erben.</p>
</blockquote>
<p>damit kann ich was anfangen, danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810914</guid><dc:creator><![CDATA[zwutz]]></dc:creator><pubDate>Fri, 20 Nov 2009 10:47:07 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsproblem on Fri, 20 Nov 2009 10:58:35 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>zwutz schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/869">@C</a> Newbie: genau das wollte ich eigentlich vermeiden</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a>: schön, dass du wiederholst, was ich bereits weiß. Wenn es gehen würde, würde ich auch nicht nach einer Alternativlösung fragen <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>
</blockquote>
<p>Gefragt hast Du gar nichts. Und dass Du weißt, dass man D nicht in A überführen kann, hast Du auch nicht geschrieben. Der dynamic_cast ist hier tatsächlich zu vermeiden, weil er falsch ist.</p>
</blockquote>
<p>Warum ist der dynamic_cast falsch?<br />
Natürlich D und A haben direkt nichts miteinander zu tun. Aber wenn z.B. ein BImpl hinter dem Zeiger steckt kann ich einen Downcast von D* nach BImpl* machen und dann habe ich mein A. Darum habe ich gedacht der dynamic_cast ist ok.<br />
Ich habe es auch gerade kurz getestet und in dem Minimalbeispiel ging es (Was aber nichts heißen muss).<br />
Also was habe ich dabei übersehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810919</guid><dc:creator><![CDATA[C Newbie]]></dc:creator><pubDate>Fri, 20 Nov 2009 10:58:35 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsproblem on Fri, 20 Nov 2009 11:55:27 GMT]]></title><description><![CDATA[<p>C Newbie schrieb:</p>
<blockquote>
<p>Also was habe ich dabei übersehen?</p>
</blockquote>
<p>Ja, laut C++-Standard ist das &quot;ill-formed&quot;. Es produziert also UB.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810950</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 20 Nov 2009 11:55:27 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsproblem on Fri, 20 Nov 2009 12:32:11 GMT]]></title><description><![CDATA[<p>hm... scheint doch nicht so zu gehen, wie ich es mir vorgestellt habe.</p>
<p>Folgendes: Ich habe einen Eingabedialog mit diversen Eingabefeldern. Die meisten davon sind variabel, also abhängig von der Umgebung sollen mal die einen, mal die anderen geladen werden.<br />
Also habe ich diese Teile in extra Dialoge ausgelagert, die dann einfach zur Laufzeit in einen Platzhalter geladen werden. Diese zwei Teile sind in meinem Beispiel BImpl und CImpl. A ist eine Basisklasse aus dem Framework und B und C sind generiert und enthalten dem vom GUI-Designer erstellten Code.</p>
<p>Jetzt sollen natürlich beide Teildialoge eine saveData- und eine loadData-Methode haben. Da erst zur Laufzeit entschieden wird, welcher Dialog genau angezeigt wird, wollte ich diese Methoden in einer Klasse (D) als pure virtual definieren und in jedem Dialog entsprechend ausprogrammieren.<br />
in etwa so würde es im Code aussehen:</p>
<pre><code class="language-cpp">class MeineKlasse
{
...
private:
    D* _dialog;
};

MeineKlasse::MeineKlasse()
{
    if (foo)
        _dialog = new BImpl();
    else
        _dialog = new CImpl();
}
</code></pre>
<p>im weiteren Code wollte ich nur mit _dialog arbeiten. Rein theoretisch geht das auch, nur müsste _dialog für andere Methoden von A abgeleitet sein, was leider nicht geht (siehe mein Schaubild oben)</p>
<p>Aber ich befürchte, über Vererbung ist das nicht lösbar...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810958</guid><dc:creator><![CDATA[zwutz]]></dc:creator><pubDate>Fri, 20 Nov 2009 12:32:11 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbungsproblem on Fri, 20 Nov 2009 12:44:18 GMT]]></title><description><![CDATA[<blockquote>
<p>Das Problem ist, ich hab jetzt zwar eine Variable vom Typ D (die entweder ein BImpl- oder CImpl-Objekt enthält),</p>
</blockquote>
<p>Verstehe ich nicht. Wer enthält wen? Meinst Du, dass Du einen Zeiger oder eine Referenz auf ein D Objekt hast, was ein Subobjekt eines BImpl- oder CImpl-Objekts ist?</p>
<p>Wenn Du an A,B,C nichts ändern kannst, könntest Du in D eine pure virtuelle Funktion hinzufügen, die einem den Zugriff auf das A-Subobjekt erlaubt, nicht?</p>
<pre><code class="language-cpp">class D {
  ...
  virtual A&amp; accessA() = 0;
  ...
};
</code></pre>
<p>Ansonsten könnten B, C und D virtuell von A erben. Aber das geht natürlich nicht, wenn Du B und C nicht ändern darfst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810965</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Fri, 20 Nov 2009 12:44:18 GMT</pubDate></item></channel></rss>