<?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[Eine Klasse, aber wahlweise virtuelle Vererbung oder eben nicht]]></title><description><![CDATA[<p>Hi!<br />
Sorry erst mal für den Titel, mir fällt kein anständiger dazu ein.</p>
<p>Ich schreibe gerade Klassen zum Lesen bzw. Schreiben in Dateien, Standardein- und Ausgabe, Sockets, usw.</p>
<p>Da habe ich folgende Basisklasse, die ein Handle für den Zugriff auf das wovon ich Lesen/Schreiben will besitzt:</p>
<pre><code>class Device
{
// blabla

protected:
int m_fd;
};
</code></pre>
<p>Davon leite ich jetzt zwei Klassen, einmal für das Lesen, einmal für das Schreiben, ab:</p>
<pre><code>class InputDevice : public Device
{
// blabla
};

class OutputDevice : public Device
{
// blabla
};
</code></pre>
<p>Jetzt kommt mein Problem. Für die Standardausgabe brauche ich jetzt zwei Objekte von der &quot;Device&quot;-Klasse, einmal für stdin und einmal für stdout. Also schreibe ich einfach:</p>
<pre><code>class ConsoleIO : public InputDevice, public OutputDevice
{
// blabla
};
</code></pre>
<p>Damit funktioniert die Klasse genau so, wie ichs haben will.<br />
Wenn ich jetzt allerdings nur ein Objekt von der &quot;Device&quot;-Klasse brauche, also z.B. für das Lesen/Schreiben einer Datei, kann ich nicht einfach schreiben:</p>
<pre><code>class FileIO : public InputDevice, public OutputDevice
{
// blabla
};
</code></pre>
<p>weil ich dann ja wieder zwei &quot;Device&quot;-Objekte habe.</p>
<p>Eine Lösung dafür wäre es jetzt, die Klasse &quot;Device&quot; von &quot;InputDevice&quot; und &quot;OutputDevice&quot; virtuell abzuleiten:</p>
<pre><code>class InputDevice : virtual public Device
{
// blabla
};

class OutputDevice : virtual public Device
{
// blabla
};
</code></pre>
<p>aber dann hab ich bei der Standardein-/ausgabe wieder nur ein &quot;Device&quot;.</p>
<p>Ich hoffe, ihr versteht mich <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="🙄"
    /><br />
Gibts da eine schöne Lösung, die &quot;Device&quot;-Klasse bei Bedarf einfach virtuell abzuleiten?</p>
<p>Danke schon mal und ein schönes Wochenende!<br />
jobe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/197992/eine-klasse-aber-wahlweise-virtuelle-vererbung-oder-eben-nicht</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 19:42:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/197992.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 16 Nov 2007 16:48:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eine Klasse, aber wahlweise virtuelle Vererbung oder eben nicht on Fri, 16 Nov 2007 16:48:20 GMT]]></title><description><![CDATA[<p>Hi!<br />
Sorry erst mal für den Titel, mir fällt kein anständiger dazu ein.</p>
<p>Ich schreibe gerade Klassen zum Lesen bzw. Schreiben in Dateien, Standardein- und Ausgabe, Sockets, usw.</p>
<p>Da habe ich folgende Basisklasse, die ein Handle für den Zugriff auf das wovon ich Lesen/Schreiben will besitzt:</p>
<pre><code>class Device
{
// blabla

protected:
int m_fd;
};
</code></pre>
<p>Davon leite ich jetzt zwei Klassen, einmal für das Lesen, einmal für das Schreiben, ab:</p>
<pre><code>class InputDevice : public Device
{
// blabla
};

class OutputDevice : public Device
{
// blabla
};
</code></pre>
<p>Jetzt kommt mein Problem. Für die Standardausgabe brauche ich jetzt zwei Objekte von der &quot;Device&quot;-Klasse, einmal für stdin und einmal für stdout. Also schreibe ich einfach:</p>
<pre><code>class ConsoleIO : public InputDevice, public OutputDevice
{
// blabla
};
</code></pre>
<p>Damit funktioniert die Klasse genau so, wie ichs haben will.<br />
Wenn ich jetzt allerdings nur ein Objekt von der &quot;Device&quot;-Klasse brauche, also z.B. für das Lesen/Schreiben einer Datei, kann ich nicht einfach schreiben:</p>
<pre><code>class FileIO : public InputDevice, public OutputDevice
{
// blabla
};
</code></pre>
<p>weil ich dann ja wieder zwei &quot;Device&quot;-Objekte habe.</p>
<p>Eine Lösung dafür wäre es jetzt, die Klasse &quot;Device&quot; von &quot;InputDevice&quot; und &quot;OutputDevice&quot; virtuell abzuleiten:</p>
<pre><code>class InputDevice : virtual public Device
{
// blabla
};

class OutputDevice : virtual public Device
{
// blabla
};
</code></pre>
<p>aber dann hab ich bei der Standardein-/ausgabe wieder nur ein &quot;Device&quot;.</p>
<p>Ich hoffe, ihr versteht mich <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="🙄"
    /><br />
Gibts da eine schöne Lösung, die &quot;Device&quot;-Klasse bei Bedarf einfach virtuell abzuleiten?</p>
<p>Danke schon mal und ein schönes Wochenende!<br />
jobe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1404565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1404565</guid><dc:creator><![CDATA[jobe]]></dc:creator><pubDate>Fri, 16 Nov 2007 16:48:20 GMT</pubDate></item><item><title><![CDATA[Reply to Eine Klasse, aber wahlweise virtuelle Vererbung oder eben nicht on Sat, 17 Nov 2007 15:20:20 GMT]]></title><description><![CDATA[<p>Das ist leider (meiner Ansicht nach) eine Defekt der Sprache C++, daß man bei der Basisklasse schon angeben muß, ob diese virtuell vererbt wird<br />
(ich weiß, daß es technisch sonst sehr schwierig wäre, damit umzugehen).</p>
<p>Leider fällt mir nichts besseres ein, als daß du zwei Versionen der Basisklasse(n) erstellst (einmal mit und einmal ohne virtual).</p>
<p>Oder aber du läßt es bei nicht-virtueller Vererbung und initialisiert im Falle von FileIO nur eine der beiden Basisklassen-Handles (d.h. die andere z.B. dann auf -1 setzen) und fragst dann halt in den entspr. Methoden ab, ob dieses Handle gesetzt ist.<br />
(Den Mehraufwand an Speicher kann man wohl hierbei ignorieren.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1404935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1404935</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Sat, 17 Nov 2007 15:20:20 GMT</pubDate></item><item><title><![CDATA[Reply to Eine Klasse, aber wahlweise virtuelle Vererbung oder eben nicht on Sat, 17 Nov 2007 15:58:10 GMT]]></title><description><![CDATA[<p>Was ich an deinem Code nicht verstehe: Für die Standardein-/ausgabe brauchst du zwei Device-Subobjekte, für die Ein-/Ausgabe per Datei brauchst du nur ein Subobjekt des Device-Typen? Ich verstehe den Sinn nicht. Ist doch egal, wohin der Datenstrom fließt bzw. woher er kommt, das Prinzip sollte ja dasselbe bleiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1404950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1404950</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Sat, 17 Nov 2007 15:58:10 GMT</pubDate></item><item><title><![CDATA[Reply to Eine Klasse, aber wahlweise virtuelle Vererbung oder eben nicht on Sat, 17 Nov 2007 21:29:49 GMT]]></title><description><![CDATA[<p>Schade, wär klasse gewesen, wenn man das elegant lösen könnte.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16525">@moagnus</a>:<br />
Für die Standardein-/ausgabe brauche ich zwei, weil es für die Eingabe und Ausgabe verschiedene Handles hat. Für eine Datei brauche ich nur einen, mit dem kann ich dann die Datei lesen und beschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1405094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1405094</guid><dc:creator><![CDATA[jobe]]></dc:creator><pubDate>Sat, 17 Nov 2007 21:29:49 GMT</pubDate></item><item><title><![CDATA[Reply to Eine Klasse, aber wahlweise virtuelle Vererbung oder eben nicht on Sun, 18 Nov 2007 01:56:27 GMT]]></title><description><![CDATA[<blockquote>
<p>aber dann hab ich bei der Standardein-/ausgabe wieder nur ein &quot;Device&quot;.</p>
</blockquote>
<p>Wo genau ist das Problem?<br />
Gehts um die Implementierung, also willst du die 2 &quot;Device&quot; Instanzen bloss damit sie intern irgendwelche Funktionalität übernehmen? In dem Fall übergib einfach Zeiger. Für Files legst du dann in der &quot;FileIO&quot; Klasse einfach ein &quot;Device&quot; Member an und übergibst den Zeiger auf das sowohl an InputDevice als auch an OutputDevice, und in ConsoleIO legst du eben 2 &quot;Device&quot; Members an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1405139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1405139</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 18 Nov 2007 01:56:27 GMT</pubDate></item></channel></rss>