<?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[Design Frage]]></title><description><![CDATA[<p>Ich habe eine kleine C++ Design Frage.<br />
Nehmen wir an ich habe eine Klasse A mit einer virtuellen Methode, sowie eine Klasse B und C, die von A erben und die Methode überschreiben:</p>
<pre><code class="language-cpp">class A {
public:
   virtual void move(int X) = 0;
};

class B : public A {
public:
   void move(int X) { /* Code der X transfortmiert */ mit X arbeiten... }
}

class C : public A {
public:
   void move(int X) { /* Code der X transfortmiert */ mit X arbeiten... }
}
</code></pre>
<p>Die Methoden in B und C kriegen einen Parameter, der erst bearbeitet (transformiert) wird und dann arbeiten beide mit X. Die Transformation ist in Klasse B und C identisch. Da der Transformationscode von X in allen Subklassen identisch ist, möchte ich ihn nun nach A schieben.<br />
Irgendwie sollen die abgeleiteten Klassen von A also bereits das transformierte X bekommen.<br />
Von der Logik her will ich also sowas (geht natürlich nicht, aber vom Sinn her):</p>
<pre><code class="language-cpp">A* a = new B;
a-&gt;move(X);  // jetzt wird zuerst in A gesprungen, dass X transformiert und 
             // dann die Methode move() von B aufgerufen, wobei das transformierte X übergeben wird
</code></pre>
<p>Ist sowas machbar?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/225015/design-frage</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 21:11:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/225015.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Oct 2008 00:21:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Design Frage on Sat, 18 Oct 2008 00:21:48 GMT]]></title><description><![CDATA[<p>Ich habe eine kleine C++ Design Frage.<br />
Nehmen wir an ich habe eine Klasse A mit einer virtuellen Methode, sowie eine Klasse B und C, die von A erben und die Methode überschreiben:</p>
<pre><code class="language-cpp">class A {
public:
   virtual void move(int X) = 0;
};

class B : public A {
public:
   void move(int X) { /* Code der X transfortmiert */ mit X arbeiten... }
}

class C : public A {
public:
   void move(int X) { /* Code der X transfortmiert */ mit X arbeiten... }
}
</code></pre>
<p>Die Methoden in B und C kriegen einen Parameter, der erst bearbeitet (transformiert) wird und dann arbeiten beide mit X. Die Transformation ist in Klasse B und C identisch. Da der Transformationscode von X in allen Subklassen identisch ist, möchte ich ihn nun nach A schieben.<br />
Irgendwie sollen die abgeleiteten Klassen von A also bereits das transformierte X bekommen.<br />
Von der Logik her will ich also sowas (geht natürlich nicht, aber vom Sinn her):</p>
<pre><code class="language-cpp">A* a = new B;
a-&gt;move(X);  // jetzt wird zuerst in A gesprungen, dass X transformiert und 
             // dann die Methode move() von B aufgerufen, wobei das transformierte X übergeben wird
</code></pre>
<p>Ist sowas machbar?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600651</guid><dc:creator><![CDATA[hörncheneich]]></dc:creator><pubDate>Sat, 18 Oct 2008 00:21:48 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Sat, 18 Oct 2008 00:31:40 GMT]]></title><description><![CDATA[<p>So in der Art?</p>
<pre><code class="language-cpp">class A {
public:
   void move(int X) // Hier KEIN virtual mehr!
   {
       // X transformieren
       ...

       // Abgeleitete Klasse soll mit X arbeiten
       intern_move( X );
   }

private:
   virtual void intern_move( int X ) = 0;

};

class B : public A {
private: // PRIVATE, soll ja nicht von außen aufrufbar sein.
   void intern_move(int X) { /* X ist schon transfortmiert */ mit X arbeiten... }
}

class C : public A {
private:
   void intern_move(int X) { /* X ist schon transfortmiert */ mit X arbeiten... }
}
</code></pre>
<p>PS: Damit klappt auch dein Codestückchen:</p>
<pre><code class="language-cpp">A* a = new B;
a-&gt;move(X);  // jetzt wird zuerst in A gesprungen, dass X transformiert und
             // dann die Methode intern_move() von B aufgerufen, wobei das transformierte X übergeben wird
</code></pre>
<p><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/1600653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600653</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 18 Oct 2008 00:31:40 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Sat, 18 Oct 2008 00:50:27 GMT]]></title><description><![CDATA[<p>Hm, das sieht wirklich schon mal gut aus. <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>2 kleine Fragen dazu:<br />
1)Wieso kann intern_move private sein? Ich dachte alles was private ist, ist für Subklassen nicht zugreifbar/sichtbar? Ich könnte in B ja auch keine private Methode von A aufrufen, oder?</p>
<ol start="2">
<li>Wenn ich jetzt schreibe: A* a = new B; a-&gt;move(X); und er dann in move() aufruft: intern_move( X ); dann ist das ja im Grunde this-&gt;intern_move(X), oder? Welchen Typ hat dann this?</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1600659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600659</guid><dc:creator><![CDATA[Hörncheneich]]></dc:creator><pubDate>Sat, 18 Oct 2008 00:50:27 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Sat, 18 Oct 2008 00:58:42 GMT]]></title><description><![CDATA[<p>Hörncheneich schrieb:</p>
<blockquote>
<p>1)Wieso kann intern_move private sein? Ich dachte alles was private ist, ist für Subklassen nicht zugreifbar/sichtbar? Ich könnte in B ja auch keine private Methode von A aufrufen, oder?</p>
</blockquote>
<p>Kleiner Fehler meinerseits, hast natürlich Recht!</p>
<p>Hörncheneich schrieb:</p>
<blockquote>
<ol start="2">
<li>Wenn ich jetzt schreibe: A* a = new B; a-&gt;move(X); und er dann in move() aufruft: intern_move( X ); dann ist das ja im Grunde this-&gt;intern_move(X), oder? Welchen Typ hat dann this?</li>
</ol>
</blockquote>
<p>this hat dann den Typ A*, weil's ja in der Klasse A ist. virtual sorgt aber ja schon dafür, dass die richtige &quot;intern_move&quot;-Funktion aufgerufen wird, also die von B.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600662</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 18 Oct 2008 00:58:42 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Sat, 18 Oct 2008 01:12:13 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Kleiner Fehler meinerseits, hast natürlich Recht!</p>
</blockquote>
<p>Ich dachte dein Code geht nicht, weil ich eigentlich bis jetzt gedacht habe man kann in Subklassen keine private Member/Methoden verwenden. Zur Sicherheit habe ich deinen Code mal versucht zu kompilieren und es klappte! Jetzt bin ich etwas verwirrt, deshalb möchte ich hier nochmal nachfragen^^<br />
Wie kann das sein das das geht? Der private Bereich soll doch die Implementierungsdetails verstecken. Eine virtual private Methode kann ich ja nur dann überschreiben, wenn ich sie kenne: sprich den private Bereich der Oberklasse. Ergibt für mich irgenwie keinen Sinn. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Badestrand schrieb:</p>
<blockquote>
<p>this hat dann den Typ A*, weil's ja in der Klasse A ist. virtual sorgt aber ja schon dafür, dass die richtige &quot;intern_move&quot;-Funktion aufgerufen wird, also die von B.</p>
</blockquote>
<p>Kann man sich das so vorstellen, dass im Speicher ein Block mit dem Teil von B und A liegt und er bei a-&gt;move(X); in den A teil springt? (obwohl ich ja ein B Objekt angelegt habe)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600665</guid><dc:creator><![CDATA[Hörncheneich]]></dc:creator><pubDate>Sat, 18 Oct 2008 01:12:13 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Sat, 18 Oct 2008 01:32:49 GMT]]></title><description><![CDATA[<p>Hörncheneich schrieb:</p>
<blockquote>
<p>Ich dachte dein Code geht nicht, weil ich eigentlich bis jetzt gedacht habe man kann in Subklassen keine private Member/Methoden verwenden. Zur Sicherheit habe ich deinen Code mal versucht zu kompilieren und es klappte! Jetzt bin ich etwas verwirrt, deshalb möchte ich hier nochmal nachfragen^^<br />
Wie kann das sein das das geht? Der private Bereich soll doch die Implementierungsdetails verstecken. Eine virtual private Methode kann ich ja nur dann überschreiben, wenn ich sie kenne: sprich den private Bereich der Oberklasse. Ergibt für mich irgenwie keinen Sinn. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Hach, ich bin jetzt auch verwirrt. Aber eigentlich doch nicht, ist eigentlich einfach: Du kannst die Methode intern_move zwar überschreiben, auch wenn sie private ist, aber du kannst von B::intern_move nicht die Methode A::intern_move aufrufen, weil sie ja von A privat ist. Aber überschreiben geht. Und weil A quasi-denkt, dass es seine eigene intern_move-Methode aufruft, geht das in Ordnung, obwohl es (bei einem B-Objekt) ja dann Bs private intern_move-Methode aufruft.</p>
<p>Hörncheneich schrieb:</p>
<blockquote>
<p>Kann man sich das so vorstellen, dass im Speicher ein Block mit dem Teil von B und A liegt und er bei a-&gt;move(X); in den A teil springt? (obwohl ich ja ein B Objekt angelegt habe)</p>
</blockquote>
<p>Hm. Man kann bei Polymorphie (also Vererbung) auch von &quot;statischem Typ&quot; und &quot;dynamischem Typ&quot; reden. Bei <code>A* a=new B;</code> ist von a der statische Typ A*, weil du a so deklariert hast. Der dynamische Typ ist aber B*, weil es <em>eigentlich</em> ein B-Objekt ist.<br />
Wenn du jetzt auf diesem Objekt a Methoden aufrufst, entscheidet darüber welche Methode (Basisklasse oder abgeleitete Klasse) aufgerufen wird, ob die entsprechende Methode als &quot;virtual&quot; deklariert ist.<br />
Ist die Methode virtual, wird nach dem dynamischen Typ gegangen, sonst nach dem statischen.</p>
<p>a-&gt;move(X) ist aber eindeutig, erstens weil die Methode move nicht virtual ist und zweitens, weil es kein B::move gibt. Gäbe es auch in B ein move(int X), dann würde trotzdem A::move aufgerufen werden, da es in A nicht als virtual deklariert ist.</p>
<p>Wo in A::move die Methode intern_move bzw this-&gt;intern_move aufgerufen wird, wird nach dem dynamischen Typ gegangen, da die Methode intern_move virtual ist. intern_move ist in B überschrieben und der dynamische Typ ist in dem Fall B, also wird B::intern_move aufgerufen.</p>
<p>edit: Bin jetzt auch mal schlafen, Antwort also frühestens morgen früh <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/1600668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600668</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 18 Oct 2008 01:32:49 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Sat, 18 Oct 2008 01:48:58 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>edit: Bin jetzt auch mal schlafen, Antwort also frühestens morgen früh <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>
</blockquote>
<p>Vielen Dank für deine Antworten. <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="👍"
    /> Schlaf gut^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600670</guid><dc:creator><![CDATA[Hörncheneich]]></dc:creator><pubDate>Sat, 18 Oct 2008 01:48:58 GMT</pubDate></item></channel></rss>