<?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[Wozu abstrakte Basisklassen?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in meinem C++ Buch das Kapitel über Polymorphie durchgelesen, und vom Prinzip her sehr gut verstanden. Jedoch habe ich Schwierigkeiten damit, realistische Anwendungsbeispiele für abstrakte Basisklassen zu finden. Wann kann/sollte man solche abstrakten Klassen einsetzen? Ich brauche nur ein paar sinnvolle Anwendungsbeispiele, aber bitte keine Beispiele nach dem Auto/Motor und sonstwas Muster. Am besten an einem praktischen Programmbeispiel näher gebracht. Vielen Dank schonmal!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/192464/wozu-abstrakte-basisklassen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 10:14:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192464.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 14 Sep 2007 17:05:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 17:05:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in meinem C++ Buch das Kapitel über Polymorphie durchgelesen, und vom Prinzip her sehr gut verstanden. Jedoch habe ich Schwierigkeiten damit, realistische Anwendungsbeispiele für abstrakte Basisklassen zu finden. Wann kann/sollte man solche abstrakten Klassen einsetzen? Ich brauche nur ein paar sinnvolle Anwendungsbeispiele, aber bitte keine Beispiele nach dem Auto/Motor und sonstwas Muster. Am besten an einem praktischen Programmbeispiel näher gebracht. Vielen Dank schonmal!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365428</guid><dc:creator><![CDATA[Fragender2]]></dc:creator><pubDate>Fri, 14 Sep 2007 17:05:48 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 17:32:09 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Serializable
{
public:
    virtual void ~Serializable() const = 0;
    template&lt;class Stream&gt;
    virtual Stream&amp; serialize(Stream&amp; stream) = 0;
};

Serializable::~Serializable()
{
}
</code></pre>
<p>Mit abstrakten Basisklassen kannst du Interfaces anbieten. In diesem Beispiel gebe ich Klassen, die von Serializable erben, eine Schnittstelle, mit deer ich sie serialisieren (z. B. in eine Datei speichern) kann.</p>
<p>Der Sinn ist also, einen einheitlichen Namen und eine einheitliche Schnittstelle für eine Operation zu geben, die für mehrere Klassen gleich ist. Ich kann ja alles mögliche in eine Datei speichern wollen. Momentan bastel ich mir was im Info-Unterricht, wo ich die Klassen Entry, abstract Item, Image : Item, Text : Item, Link : Item hab. Wenn das Programm nun beendet wird, soll die gesamte Struktur in eine Datei gespeichert werden.</p>
<p>Nun könnte ich den Ansatz wählen, dass ich durch die Objekte durchiteriere und versuche, jedes Objekt irgendwie in Text zu verwandeln. Das hat vor allem die Nachteile, dass es ein Riesenverwaltungsapparat wird und ich außerdem auch noch alle Typen kennen muss (-&gt; Abhängigkeiten). Wenn ich jetzt einen neuen Typ Tabelle einfüge und vergesse, ihn in der zentralen Speicherungseinheit dazuzuschreiben, hab ich eine Inkonsistenz in meinem Programm.</p>
<p>Der Ausweg ist, dass jedes Objekt sich selbst serialisiert, d. h. ich rufe nur serialize() auf und jedes Objekt weiß von sich selbst am besten, wie es sich in einen Stream umzuformen hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365443</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 14 Sep 2007 17:32:09 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 17:37:02 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;class Stream&gt;
    virtual Stream&amp; serialize(Stream&amp; stream) = 0;
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Ein Memberfunktionstemplate darf nicht virtuell sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365451</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 14 Sep 2007 17:37:02 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 17:33:10 GMT]]></title><description><![CDATA[<p>wat wieso denn das?<br />
Der typ ist doch festgelegt, da kann man doch keon falsches template aufrufen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365452</guid><dc:creator><![CDATA[grdgred]]></dc:creator><pubDate>Fri, 14 Sep 2007 17:33:10 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 17:33:51 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Michael E. schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;class Stream&gt;
    virtual Stream&amp; serialize(Stream&amp; stream) = 0;
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Templatefunktionen können und dürfen nicht virtuell sein.</p>
</blockquote>
<p>Wieder den Standard auswendig gelernt? <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</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365454</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 14 Sep 2007 17:33:51 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 17:34:58 GMT]]></title><description><![CDATA[<p>und grade wenn man viele hier Serializable hat, kann man alle auch wenn sie unterschiedlich sind in einem array (oder anderen iterierbaren Datentypen) unterbringen, und verwalten.</p>
<p>Bei grafischer programmierung gibt es auch eine Anwendungsmöglichkeit, denn da kann man beispielsweise alle grafisch darstellbaren Klassen (Helden, Steine, etc) mit einer Schnittstelle verwalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365457</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Fri, 14 Sep 2007 17:34:58 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 17:47:06 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Wieder den Standard auswendig gelernt? <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</p>
</blockquote>
<p>Das sollte Grundwissen sein, wenn man mit solchen Konstrukten arbeitet - einerseits wird dich der Compiler sowieso drauf hinweisen, andererseits ist die Regel nicht wirklich überraschend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365468</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 14 Sep 2007 17:47:06 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 17:48:30 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20068">@Michael</a> E. ***einfacher gehts kaum?! Wenn ich mich dumm stell, also mal angenommen dann versteh das nicht mal ich. <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>
<p>Zur Frage:</p>
<p>Stell dir vor du schreibst ein Grafikprogramm mit einer Pluginschnittstelle, die andere Entwickler für ihre Plugins nutzen können.<br />
Dann würdest du wahrscheinlich eine abstrakte Basisklasse, wie die folgende entwickeln:</p>
<pre><code>class IPlugin
{
public:
    virtual void ~IPlugin() = 0;
    virtual SUCCEEDED PluginTaskForImage(IMAGE **Image) = 0;
    ....
};
</code></pre>
<p>Der Pluginentwickler würde dann seine Pluginklasse von deiner &quot;IPlugin&quot; ableiten und hinterher bei deiner PluginAPI eine instanz dieser durch eine Funktion wie zB. &quot;AddPlugin( IPlugin * Interface);&quot; anmelden.</p>
<p>Das würde dann so aussehen:</p>
<pre><code>class CPlugin : public IPlugin
{
public:
    CPlugin(...);
    void ~CPlugin();
    SUCCEEDED PluginTaskForImage(IMAGE **Image);
    ....
};

...

//zB. innerhalb der DllMain
CPlugin *myPlugin = new CPlugin(...);
PluginAPI::AddPlugin( static_cast&lt;IPlugin*&gt; myPlugin);
</code></pre>
<p>MfG Wally</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365470</guid><dc:creator><![CDATA[Wally]]></dc:creator><pubDate>Fri, 14 Sep 2007 17:48:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 18:13:04 GMT]]></title><description><![CDATA[<p>Danke für die vielen Antworten.</p>
<p>Michael E. schrieb:</p>
<blockquote>
<p>Mit abstrakten Basisklassen kannst du Interfaces anbieten. In diesem Beispiel gebe ich Klassen, die von Serializable erben, eine Schnittstelle, mit deer ich sie serialisieren (z. B. in eine Datei speichern) kann.</p>
</blockquote>
<p>Erstmal habe ich nicht ganz verstanden, was du mit Plugins meinst, aber durch die nachfolgenden Erklärungen ist es mir klar geworden. <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>Wally schrieb:</p>
<blockquote>
<p>Der Pluginentwickler würde dann seine Pluginklasse von deiner &quot;IPlugin&quot; ableiten und hinterher bei deiner PluginAPI eine instanz dieser durch eine Funktion wie zB. &quot;AddPlugin( IPlugin * Interface);&quot; anmelden.</p>
</blockquote>
<p>Jetzt hab ich es geschnallt. Der Grundgedanke ist also der, dass meine Plugin-API einen umkonvertierten Klassenzeiger der fremden (von der absktrakten Basisklasse abgeleiteten) Pluginklasse erhält, und dann die in der abgeleiteten Klasse redefinierten Methoden aufrufen kann, so als seien es die klasseneigenen Methoden, richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365483</guid><dc:creator><![CDATA[Fragender2]]></dc:creator><pubDate>Fri, 14 Sep 2007 18:13:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 18:33:02 GMT]]></title><description><![CDATA[<p>Okay, das gibt mir die Bestätigung, es funktioniert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

class AbstractBasis
{
    public:
        virtual void Test (const std::string &amp;text) = 0;
};

class DerivedClass : public AbstractBasis
{
    public:
        void Test (const std::string &amp;text) {
            std::cout &lt;&lt; &quot;Derived Class: &quot; &lt;&lt; text &lt;&lt; std::endl;
        }
};

class AbstractAPI
{
    public:
        void AddPlugin (DerivedClass *Handler) {
            Handler-&gt;Test (&quot;Hallo, ich bins&quot;);
        }
};

int main ()
{
    DerivedClass *derive = new DerivedClass;
    AbstractAPI api;
    api.AddPlugin (static_cast &lt;DerivedClass*&gt; (derive));
    std::cin.get ();
}
</code></pre>
<p>Danke an euch! <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/1365496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365496</guid><dc:creator><![CDATA[Fragender2]]></dc:creator><pubDate>Fri, 14 Sep 2007 18:33:02 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 18:42:15 GMT]]></title><description><![CDATA[<p>Sorry, eine Unklarheit ist mir noch aufgekommen, es geht um folgendes:</p>
<p>Die Klasse AbstractAPI währe in diesem Beispiel eine Klasse meines Grafikprogramms, die eine Instanz der abgeleiteten (-&gt;fremden) Klasse erwartet, und dann dessen Methoden aufrufen kann. Genau das passiert in dieser Zeile:</p>
<pre><code class="language-cpp">void AddPlugin (DerivedClass *Handler) {
            Handler-&gt;Test (&quot;Hallo, ich bins&quot;);
        }
</code></pre>
<p>Allerdings muss in den Funktionsparametern von AddPlugin () der Objekttyp der fremden Klasse bekannt sein (in dem Fall DerivedClass), um die übergebene Instanz einen bestimmten Klassentyp zuzuordnen zu können. In diesem Programmbeispiel klappt das ja noch ganz gut, da ich ja DerivedClass kenne, die aber eigentlich die (unbekannte) Fremdklasse des Plugins ist. Woher soll nun AddPlugin wissen, welchen Objekttyp *Handler zugeordnet werden soll? Folgendes Beispiel klappt so nicht:</p>
<pre><code class="language-cpp">void AddPlugin (void *Handler) {
            Handler-&gt;Test (&quot;Hallo, ich bins&quot;);
        }
</code></pre>
<p>Welche Lösung gibt es da?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365502</guid><dc:creator><![CDATA[Fragender2]]></dc:creator><pubDate>Fri, 14 Sep 2007 18:42:15 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 19:23:18 GMT]]></title><description><![CDATA[<p>Und woher weißt du wie die Funktion heißt die du ausführst?<br />
also</p>
<p>void AddPlugin (DerivedClass *Handler) {<br />
Handler-&gt;Test (&quot;Hallo, ich bins&quot;);<br />
}</p>
<p>Test(char * sonstwas) ??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365528</guid><dc:creator><![CDATA[KrokantKrockete]]></dc:creator><pubDate>Fri, 14 Sep 2007 19:23:18 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 19:26:55 GMT]]></title><description><![CDATA[<blockquote>
<p>Und woher weißt du wie die Funktion heißt die du ausführst?</p>
</blockquote>
<p>Das ist ja nicht das Problem, er ruft lediglich die Funktionen auf, die er in seiner abstrakten Basisklasse vordefiniert hat, die anderen (ihm unbekannten) Funktionen der Klasseninstanz sind unrelevant. Nicht aber der Klassentyp <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/1365532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365532</guid><dc:creator><![CDATA[mikey]]></dc:creator><pubDate>Fri, 14 Sep 2007 19:26:55 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 19:28:10 GMT]]></title><description><![CDATA[<blockquote>
<p>Das ist ja nicht das Problem, er ruft lediglich die Funktionen auf, die er in seiner abstrakten Basisklasse vordefiniert hat, die anderen (ihm unbekannten) Funktionen der Klasseninstanz sind unrelevant. Nicht aber der Klassentyp <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>Achso ich fürchte da kann ich nicht helfen würde mich aber auch interessieren <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/1365533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365533</guid><dc:creator><![CDATA[KrokantKrockete]]></dc:creator><pubDate>Fri, 14 Sep 2007 19:28:10 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 20:08:16 GMT]]></title><description><![CDATA[<p>Genau dafür ist Polymorphie da. Du kannst folgendes schreiben:</p>
<pre><code class="language-cpp">void AddPlugin (AbstractBasis* Handler) {
            Handler-&gt;Test (&quot;Hallo, ich bins&quot;);
        }
</code></pre>
<p>Dadurch, dass Handler ein Zeiger (ginge auch mit ner Referenz) ist, wird bei virtuellen Funktionsaufrufen erst mal der dynamische Typ des Objekts rausgefunden und dann die passende Funktion aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365553</guid><dc:creator><![CDATA[Michael E. logged out]]></dc:creator><pubDate>Fri, 14 Sep 2007 20:08:16 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu abstrakte Basisklassen? on Fri, 14 Sep 2007 20:24:08 GMT]]></title><description><![CDATA[<blockquote>
<p>Dadurch, dass Handler ein Zeiger (ginge auch mit ner Referenz) ist, wird bei virtuellen Funktionsaufrufen erst mal der dynamische Typ des Objekts rausgefunden und dann die passende Funktion aufgerufen.</p>
</blockquote>
<p>Mensch, jetzt wird's mir auch klar... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /> Hast ja Recht, manchmal sieht man den Wald vor lauter Bäumen nicht. Danke <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1365561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365561</guid><dc:creator><![CDATA[Fragender2]]></dc:creator><pubDate>Fri, 14 Sep 2007 20:24:08 GMT</pubDate></item></channel></rss>