<?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[Abstrakten Klassen erben]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe schon einige Einträge zum Thema ABC (abstract basis classes) gelesen,<br />
aber irgendwie passt das ganze noch nicht so zu meinem Vorhaben.</p>
<p>Nun zu meinem Problem:</p>
<p>Ich habe eine abstrakte Klasse A</p>
<pre><code class="language-cpp">class InterfaceA
{
  public:
    std::string GetVersionOfA() = 0;
}
</code></pre>
<p>Dazu eine entsprechende Klasse A:</p>
<pre><code class="language-cpp">class A: public InterfaceA
{
  public:
    std::string GetVersionOfA();
}
</code></pre>
<p>Nun habe ich weiter eine abstrakte Klasse B:</p>
<pre><code class="language-cpp">class InterfaceB
{
   public:
    std::string GetVersionOfB()=0;
}
</code></pre>
<p>Und eine dazugehörende Klasse B:</p>
<pre><code class="language-cpp">class B: public A, public InterfaceB
{
  public:
   std::string GetVersionOfB();
}
</code></pre>
<p>Wenn ich nun ein Objekt von der Klasse B erzeuge, kann ich leider nicht<br />
auf</p>
<pre><code class="language-cpp">GetVersionOfA
</code></pre>
<p>zugreifen!<br />
Was mache ich an dieser Stelle falsch?</p>
<p>Besten Dank für eure Hilfe</p>
<p>Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/241775/abstrakten-klassen-erben</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 06:53:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/241775.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 May 2009 20:59:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Abstrakten Klassen erben on Mon, 25 May 2009 20:59:38 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe schon einige Einträge zum Thema ABC (abstract basis classes) gelesen,<br />
aber irgendwie passt das ganze noch nicht so zu meinem Vorhaben.</p>
<p>Nun zu meinem Problem:</p>
<p>Ich habe eine abstrakte Klasse A</p>
<pre><code class="language-cpp">class InterfaceA
{
  public:
    std::string GetVersionOfA() = 0;
}
</code></pre>
<p>Dazu eine entsprechende Klasse A:</p>
<pre><code class="language-cpp">class A: public InterfaceA
{
  public:
    std::string GetVersionOfA();
}
</code></pre>
<p>Nun habe ich weiter eine abstrakte Klasse B:</p>
<pre><code class="language-cpp">class InterfaceB
{
   public:
    std::string GetVersionOfB()=0;
}
</code></pre>
<p>Und eine dazugehörende Klasse B:</p>
<pre><code class="language-cpp">class B: public A, public InterfaceB
{
  public:
   std::string GetVersionOfB();
}
</code></pre>
<p>Wenn ich nun ein Objekt von der Klasse B erzeuge, kann ich leider nicht<br />
auf</p>
<pre><code class="language-cpp">GetVersionOfA
</code></pre>
<p>zugreifen!<br />
Was mache ich an dieser Stelle falsch?</p>
<p>Besten Dank für eure Hilfe</p>
<p>Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715728</guid><dc:creator><![CDATA[schmidm6]]></dc:creator><pubDate>Mon, 25 May 2009 20:59:38 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakten Klassen erben on Mon, 25 May 2009 21:34:29 GMT]]></title><description><![CDATA[<p>Stichwort virtual:</p>
<pre><code class="language-cpp">//InterfaceA.h
class InterfaceA
{
    public:
        virtual std::string GetVersionOfA() = 0;
};
</code></pre>
<pre><code class="language-cpp">//InterfaceB.h
class InterfaceB
{
    public:
        virtual std::string GetVersionOfB() = 0;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1715742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715742</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Mon, 25 May 2009 21:34:29 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakten Klassen erben on Tue, 26 May 2009 04:58:37 GMT]]></title><description><![CDATA[<p>Das Zauberwort &quot;virtual&quot; hab ich natürlich schon verwendet, habs aber leider<br />
in meinem Beispiel hier vergessen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Wenn ich nun ein Objekt von B erstelle, sehe ich alle Funktionen, die in InterfaceB definiert sind, aber keine aus InterfaceA. Es ist also so, wie ich<br />
beschrieben habe, nach wie vor.</p>
<p>Gruss<br />
Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715782</guid><dc:creator><![CDATA[schmidm6]]></dc:creator><pubDate>Tue, 26 May 2009 04:58:37 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakten Klassen erben on Tue, 26 May 2009 05:10:39 GMT]]></title><description><![CDATA[<p>mmmhhhhh, wenn ich selber weiter darüber nachdenke, könnte der Fehler an einer anderen Stelle generiert werden. Daher erweitere ich jetzt Mal meine Ausführungen:</p>
<p>Die oben erwähnten Klassen habe ich in eine z.B. testCode.dll ausgelagert.<br />
Anschliessend lade ich die Bibliothek ganz nach Anleitung von der msdn homepage.<br />
Bis hier hin ist es auch kein Problem.</p>
<p>Nach dem Laden benutze ich eine Factory-Function um ein Objekt B zu erstellen.<br />
Dies sieht in etwas so aus:</p>
<pre><code class="language-cpp">extern &quot;C&quot; __declspec (dllexport) InterfaceB* createB()
{
   // call the constructor of the actual class
   InterfaceB *module = static_cast&lt;InterfaceB*&gt; (new B());
   // return the created function;
   return module;
};
</code></pre>
<p>Hier scheint das Problem zu sein, da ich das neue Objekt auf ein InterfaceB caste, nehme ich Mal an.</p>
<p>Wie kann ich das nun ändern, oder was muss ich tun, dass InterfaceA trotzdem zugänglich ist. Ich kann nicht InterfaceB von InterfaceA ableiten.</p>
<p>Ich hoffe, jemand weiss Rat</p>
<p>Gruss und besten Dank im Voraus</p>
<p>Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715784</guid><dc:creator><![CDATA[schmidm6]]></dc:creator><pubDate>Tue, 26 May 2009 05:10:39 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakten Klassen erben on Tue, 26 May 2009 05:33:52 GMT]]></title><description><![CDATA[<p>Wenn du B als InterfaceB ansprichst, dann stehen dir auch nur die Methoden von InterfaceB zur Verfügung. Wenn du die Funktionen von A benötigst, musst du entweder nach A (oder InterfaceA) casten. Ansonsten wirst du wohl ein zusätzliches Interface benötigen. Muss B undbedingt von A erben? Vielleicht kann man auch A und B getrennt voneinander implementieren und in einem C zusammenfassen.</p>
<p>Greetz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715786</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Tue, 26 May 2009 05:33:52 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakten Klassen erben on Tue, 26 May 2009 09:55:28 GMT]]></title><description><![CDATA[<p>In der Realität ist Klasse A eine Klasse für Single-Layer-Perceptrons und Klasse B entsprechend die Erweiterung für Multi-Layer-Perceptrons. Daher erscheint mir das Erben durchaus sinnvoll.</p>
<p>Ich denke da schon länger über ein anderes Interface nach, aber alles was ich teste, scheint an der Vererbung zu scheitern.<br />
Kennst jemand einen Link oder so, der auf diese oder eine ähnliche Problematik eingeht?<br />
Alle Links, die ich bisher gefunden haben, beschäftigen sich eher mit den Grundlagen der Vererbung und abstrakten Klassen.</p>
<p>Danke schön</p>
<p>Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715890</guid><dc:creator><![CDATA[schmidm6]]></dc:creator><pubDate>Tue, 26 May 2009 09:55:28 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakten Klassen erben on Tue, 26 May 2009 09:59:31 GMT]]></title><description><![CDATA[<blockquote>
<p>In der Realität ist Klasse A eine Klasse für Single-Layer-Perceptrons und Klasse B entsprechend die Erweiterung für Multi-Layer-Perceptrons. Daher erscheint mir das Erben durchaus sinnvoll.</p>
</blockquote>
<p>Naja, so sinnvoll empfinde ich das nicht.<br />
Das sie das gleiche Interface bereitstellen kann (wird vermutlich auch) ok sein. Jedoch dass der Multi Dings vom Single Dings die Impl. erbt denke ich macht nicht so sinn. Ev. sind zwei unabhängige Klasse besser, ev. mit Komposition die gemeinsame Teile der Impl. einbinden.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715892</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 26 May 2009 09:59:31 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakten Klassen erben on Tue, 26 May 2009 12:56:15 GMT]]></title><description><![CDATA[<p>Kann sein, dass ich noch etwas verpasst habe in der OOP-Programmierung.</p>
<p>Das Singel-Dings ist aber immer komplett in einem Multi-Dings <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="😉"
    /> vorhanden.<br />
Das Multi-Dings erweitert also einfach das Singel-Dings. Sollte man da nicht vererben ?</p>
<p>Ich persönlich möchte definitiv kein Code an 2 stellen in der Software.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716034</guid><dc:creator><![CDATA[schmidm6]]></dc:creator><pubDate>Tue, 26 May 2009 12:56:15 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakten Klassen erben on Tue, 26 May 2009 13:08:17 GMT]]></title><description><![CDATA[<p>Singeldingens und Multidingens, isch klar <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="😃"
    /><br />
Naja ich weiß nicht wo dein Problem ist, denn wenn ich dein Programm Code nutze und in den jeweiligen Interfaces virtual benutze, kann ich, wenn ich ein Objekt von der Klasse B erstelle, Funktionen von Klasse A benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716044</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Tue, 26 May 2009 13:08:17 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakten Klassen erben on Tue, 26 May 2009 13:15:00 GMT]]></title><description><![CDATA[<p>wie schon erwähnt, gehe ich davon aus, dass ich das Problem selber erzeuge, in dem ich zum einen den ganzen Code in einer dll habe und zum andern ein Objekt von B erzeuge mittels Factory-Function. Dazu verwende ich einen static_cast auf das InterfaceB ...</p>
<p>Leider habe ich bisher keinen anderen Weg gefunden. Daher denke ich zur Zeit nochmals über die Grundlagen der Vererbung nach. Bisher leider ohne Erfolg, die zündende Idee steckt noch irgendwo fest.</p>
<p>Die InterfaceA.h sowie die InterfaceB.h includiere ich in meinem Test-Programm.<br />
Aber durch den static_cast werde ich wohl den Zugriff auf InterfaceA irgendwie unterbinden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716048</guid><dc:creator><![CDATA[schmidm6]]></dc:creator><pubDate>Tue, 26 May 2009 13:15:00 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakten Klassen erben on Tue, 26 May 2009 13:30:50 GMT]]></title><description><![CDATA[<p>Der cast in deiner Factory Funktion ist sowiso unnötig.<br />
Ausserdem würde ich bei solchen Dingen, wenn schon, dann den dynamic_cast verwenden (der wird nämlich zur runtime geprüft).<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716061</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 26 May 2009 13:30:50 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakten Klassen erben on Tue, 26 May 2009 13:34:06 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19847">@Freaky</a>,<br />
Sein Problem ist, dass er von einem <code>InterfaceB</code> Zeiger aus, auf Methoden von <code>A</code> , bzw. <code>InterfaceA</code> zugreifen will. Die sind natürlich nicht bekannt, da <code>InterfaceB</code> weder von <code>A</code> noch von <code>InterfaceA</code> erbt. Das typische Anfängerproblem <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9588">@schmidm6</a>,<br />
Von mir aus gesehen hast du den besten Hinweis, dass deine Vererbung falsch sein muss, denn der Code funktioniert so nicht. Wenn ein Objekt von <code>InterfaceB</code> erbt, dann wissen wir nichts darüber, ob es auch von <code>InterfaceA</code> oder <code>A</code> erbt.</p>
<p>Wie theta es bereits gesagt hat, wäre womöglich eine Komposition besser. Zum Beispiel könntest du eine Instanz von <code>A</code> in die Klasse <code>B</code> setzen und der Zugriff auf <code>A</code> kapseln.<br />
Die <em>is-a</em> Beziehung ist eine extrem starke Bindung, man sollte diese nicht nur einsetzen, weil man einen Code nicht doppelt schreiben möchte. Für sowas kann man den Code selber in eine dritte Klasse oder freie Funktion auslagern.</p>
<p>Wir kennen dein Design leider zu wenig, bzw. auch was dahinter steht. Ich habe keine Ahnung was dieses Single-Dings oder Multi-Dings sein soll <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="😉"
    /><br />
Daher ist es auch ein wenig schwer, dir beim Verbessern des Designs zu helfen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716065</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 26 May 2009 13:34:06 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakten Klassen erben on Tue, 26 May 2009 19:17:12 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich habe mich nun nochmals einige Zeit mit der OOP-Programmierung beschäftigt. Es sieht nicht so aus, als wäre ich geistig in der Lage, das ganze in der kurzen Zeit zu verarbeiten.</p>
<p>Ich habe nun meinen Code soweit angepasst, dass InterfaceB auch die Definitionen von InterfaceA enthällt. Die Klasse A erbt von InterfaceB</p>
<pre><code class="language-cpp">class A: public InterfaceB
{
...
}
</code></pre>
<p>und die Klasse B erbt von A:</p>
<pre><code class="language-cpp">class B: public A ...
</code></pre>
<p>soweit ist dies wohl nicht der eleganteste Weg, aber er funktioniert vorläufig und dann werde ich den Rest schon noch mal packen ...</p>
<p>Besten Dank bis dahin ...</p>
<p>Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716344</guid><dc:creator><![CDATA[schmidm6]]></dc:creator><pubDate>Tue, 26 May 2009 19:17:12 GMT</pubDate></item></channel></rss>