<?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[Frage zu Klassendesign]]></title><description><![CDATA[<p>Guten Tag, ich habe eine Frage zur Vererbung. Ich möchte zu Übungszwecken eine Spezialisierung der Klasse fstream schreiben. Sie soll ganz spezielle Dateitypen verarbeiten können und mehr nicht.</p>
<pre><code class="language-cpp">class CSpezialDatei : public fstream
</code></pre>
<p>Wenn ich das allerdings so mache, kann der Programmierer immer noch von aussen auf die fstream-Memberfunktionen zugreifen (z.B. close() etc.).<br />
Ich möchte aber, dass meine Klasse nur wenige public-Methoden hat, sodass der Programmierer möglichst wenig falsch machen kann.<br />
Durch Rumprobieren bin ich jetzt auf die private-Vererbung gekommen. Dort kann der Programmierer letztendlich nur auf meine Funktionen zugreifen und die Basisklasse ist völlig abgeschachtelt. Allerdings meine ich mal gelesen zu haben, dass private-Vererbung überflüssig ist. Durch Googlen habe ich allerdings nicht herausgefunden warum.</p>
<p>Zweite Frage: Wie löst man mein Problem am &quot;professionellsten&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306218/frage-zu-klassendesign</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 07:36:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306218.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 21 Jul 2012 14:18:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Klassendesign on Sat, 21 Jul 2012 14:18:04 GMT]]></title><description><![CDATA[<p>Guten Tag, ich habe eine Frage zur Vererbung. Ich möchte zu Übungszwecken eine Spezialisierung der Klasse fstream schreiben. Sie soll ganz spezielle Dateitypen verarbeiten können und mehr nicht.</p>
<pre><code class="language-cpp">class CSpezialDatei : public fstream
</code></pre>
<p>Wenn ich das allerdings so mache, kann der Programmierer immer noch von aussen auf die fstream-Memberfunktionen zugreifen (z.B. close() etc.).<br />
Ich möchte aber, dass meine Klasse nur wenige public-Methoden hat, sodass der Programmierer möglichst wenig falsch machen kann.<br />
Durch Rumprobieren bin ich jetzt auf die private-Vererbung gekommen. Dort kann der Programmierer letztendlich nur auf meine Funktionen zugreifen und die Basisklasse ist völlig abgeschachtelt. Allerdings meine ich mal gelesen zu haben, dass private-Vererbung überflüssig ist. Durch Googlen habe ich allerdings nicht herausgefunden warum.</p>
<p>Zweite Frage: Wie löst man mein Problem am &quot;professionellsten&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234558</guid><dc:creator><![CDATA[Telefonmann]]></dc:creator><pubDate>Sat, 21 Jul 2012 14:18:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassendesign on Sat, 21 Jul 2012 14:30:19 GMT]]></title><description><![CDATA[<p>Hallo Telefonmann,</p>
<p>zunächst ist es keine gute Idee von einem stream aus dem C++-Standard abzuleiten, um sein Verhalten zu ändern, oder gar einzuschränken. Egal ob std::fstream oder std::stringstream.<br />
Wenn Du wirklich den fstream vor dem User Deiner Klasse verbergen willst und Du sowieso die benötigten Methoden implementierst, so nehme ihn doch einfach als Member auf.</p>
<pre><code class="language-cpp">class CSpezialDatei
{
    // .. irgendwas
private:
    std::fstream my_stream_;
};
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234560</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sat, 21 Jul 2012 14:30:19 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassendesign on Sat, 21 Jul 2012 14:44:27 GMT]]></title><description><![CDATA[<p>Danke dir für die schnelle Antwort!<br />
Bis jetzt habe ich dies auch immer so gemacht, aber ich dachte es wäre &quot;anfängermässig&quot; wenn man immer nur kapselt. An sich verstehe ich ja wie es funktioniert, aber ich weiss noch nicht genau, wann ich es einsetzen sollte.<br />
Die einfachen Beispiele aus Büchern verstehe ich, aber effektiv habe ich bisher nur wenige Einsatzmöglichkeiten in meinen (kleinen) Programmen gefunden... Kann mir jemand einen häufigen Einsatzzweck nennen?<br />
Ich habe es momentan nur im Zusammenhang mit QT kennengelernt, ansonsten waren andere Möglichkeiten meist eleganter...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234564</guid><dc:creator><![CDATA[Telefonmann]]></dc:creator><pubDate>Sat, 21 Jul 2012 14:44:27 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassendesign on Sat, 21 Jul 2012 14:46:09 GMT]]></title><description><![CDATA[<p>ja, am besten ist hier die komposition anzuwenden.</p>
<p>aber wer oder was sagt, dass private inheritence überflüssig ist?<br />
es macht was anderes als normale (öffentliche) vererbung, aber das ist ja auch ok...</p>
<p>hat du zufällig einen link oder sowas zu der quelle?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234566</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 21 Jul 2012 14:46:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassendesign on Sat, 21 Jul 2012 15:11:14 GMT]]></title><description><![CDATA[<p>Hi Du Katze!</p>
<blockquote>
<p>Bis jetzt habe ich dies auch immer so gemacht, aber ich dachte es wäre &quot;anfängermässig&quot; wenn man immer nur kapselt. An sich verstehe ich ja wie es funktioniert, aber ich weiss noch nicht genau, wann ich es einsetzen sollte.</p>
</blockquote>
<p>Satz 1 ist per se nicht sinnvoll, Kapselung ist ein feines Konzept, meistens ist das eleganter als alles andere. Satz 2 verstehe ich nicht, meinst Du, Du weißt nicht, wann Du Vererbung anwenden solltest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234568</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 21 Jul 2012 15:11:14 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassendesign on Sat, 21 Jul 2012 16:08:16 GMT]]></title><description><![CDATA[<blockquote>
<p>Satz 2 verstehe ich nicht, meinst Du, Du weißt nicht, wann Du Vererbung anwenden solltest?</p>
</blockquote>
<p>Exakt.</p>
<blockquote>
<p>hat du zufällig einen link oder sowas zu der quelle?</p>
</blockquote>
<p>Ne, nur ab und zu mal beim Surfen gelesen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234581</guid><dc:creator><![CDATA[Telefonmann]]></dc:creator><pubDate>Sat, 21 Jul 2012 16:08:16 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassendesign on Sat, 21 Jul 2012 16:29:01 GMT]]></title><description><![CDATA[<p>mh, public vererbung heisst sowas wie:<br />
Derive ist ein Base</p>
<p>und private vererbung heisst:<br />
B ist implementiert durch Base</p>
<p>sprich man kann bei private inheritance die methoden aufrufen und seine eigenen dinge bearbeiten, jedoch sieht es nach aussen nicht so aus wie ein Base und ist damit auch nicht polymorph behandelbar. unsinnig ist es damit aber noch lange nicht</p>
<p>es ist ja quasi sowas wie komposition, und für dein beispiel/problem könnte man das schon verwenden</p>
<p>was sich mir nicht erschließt ist protected vererbung. da fällt mir echt nix zu ein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234585</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 21 Jul 2012 16:29:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassendesign on Sat, 21 Jul 2012 17:03:23 GMT]]></title><description><![CDATA[<p>Ich glaube, er hat sogar Probleme überhaupt Anwendungsfelder für Vererbung zu finden, dann hilft es nicht wirklich viel über private/protected-Vererbung zu philosophieren.</p>
<p>Vererbung dient normalerweise nicht zur Schnittstellenverkleinerung sondern zur -erweiterung. Wenn man also eine bestehende Klasse um einige Methoden erweitern will, <em>kann</em> das Sinn machen, wobei auch hier Komposition meist vorzuziehen ist. Der beste Anwendungsfall für Vererbung ist in meinen Augen, wenn man es mit Polymorphie kombinieren kann, wenn Du z.B. 10 Autos in einen Container (z.B. vector, list usw.) stecken möchtest, die Methode fahren() aber für einen BMW anders implementiert ist als für einen Porsche o.ä.</p>
<p>Dann abstrahiert man nämlich verschiedene Klassen (Porsche, BMW) durch eine generelle Schnittstelle weg (Auto). Benötigen bestimmte andere Klassen jetzt ein Auto, dann müssen sie nichts über die Details von BMW und Porsche wissen. Dadurch lassen sich beliebig viele weitere Autoklassen erstellen, ohne dass der aktuelle Code verändert werden muss und dadurch bedingt verbessert man die Erweiterbarkeit und Wartbarkeit (man kann die BMW-Klasse erweitern/verbessern) der Architektur.</p>
<p>Aber Vererbung hat eben auch Nachteile, weil es feste Abhängigkeiten schafft. In Deinem Fall wäre z.B. die Kapselung von fstream einer Vererbung (unabhängig davon, dass ich nicht weiß, ob die hier funktioniet, weil man bei den Std-Klassen immer etwas aufpassen muss) z.B. deswegen deutlich überlegen, weil Du später intern ja vielleicht eine andere Klasse als fstream nutzen möchtest, um das Lesen/Schreiben auf Dateien zu unterstützen. Durch Vererbung würde der Benutzer aber wissen &quot;hey, das <em>ist</em> ein fstream, ich kann den genau so benutzen&quot;... und wenn Du dann von etwas anderem erbst, ändert sich die ganze Schnittstelle.</p>
<p>Edit/PS: Das alles bezieht sich jetzt auf die public-Vererbung, das ist die normale, die eine &quot;ist ein&quot;-Beziehung ausdrückt. private/protected-Vererbung sind eben andere Dinger, aber davon würde ich erstmal die Finger lassen. Die haben ihre Anwendungsfälle und auch Vorteile in bestimmten Situationen, aber auf die trifft man meiner Meinung nach nicht oft und nicht schnell.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234590</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 21 Jul 2012 17:03:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassendesign on Sat, 21 Jul 2012 18:13:59 GMT]]></title><description><![CDATA[<blockquote>
<p>Zitieren<br />
Ich glaube, er hat sogar Probleme überhaupt Anwendungsfelder für Vererbung zu finden, dann hilft es nicht wirklich viel über private/protected-Vererbung zu philosophieren.</p>
</blockquote>
<p>Leider stimmt das so <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Danke für die Erklärung! Habe ich gut verstanden und denke, dass ich dem Verständniss von Vererbung (im Großen und Ganzen) jetzt deutlich näher gekommen bin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234615</guid><dc:creator><![CDATA[Telefonmann]]></dc:creator><pubDate>Sat, 21 Jul 2012 18:13:59 GMT</pubDate></item></channel></rss>