<?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[Basisklassenzeiger auf Klassentemplate?]]></title><description><![CDATA[<p>Hallo, ist wahrscheinlich ein dumme Frage, da ich weiß, dass das eigentlich nicht gehen sollte, aber vielleicht kennt ja jemand einen Trick dafür oder weiß ein besseres Design.</p>
<p>Gegeben folgende Klassenstruktur:</p>
<pre><code class="language-cpp">template&lt;typename&gt; class Vater;

class Sohn: public Vater&lt;Sohn&gt;;
class Tochter: public Vater&lt;Tochter&gt;;
</code></pre>
<p>Gibt es einen Weg, Objekte vom Typ Tochter und Sohn über einen gemeinsamen Zeiger anzusprechen? Naiv natürlich nicht, da Vater&lt;Sohn&gt; und Vater&lt;Tochter&gt; grundverschieden sein könnten. Aber ich als Programmierer weiß ja, dass die Unterschiede an der Codestelle an der ich das brauche nicht von Belang sind. Ich benutze nur Sachen, die nichtstatische Eigenschaften des Vater-Templates sind. Könnte man da vielleicht mit Mehrfachvererbung was tricksen?</p>
<p>Was ich vor habe:<br />
Abhängig vom ziehen einer Zufallszahl wird etwas mit einem Objekt vom Typ Tochter oder Sohn gemacht. In Pseudocode so:</p>
<pre><code class="language-cpp">template&lt;typename&gt; class Vater{
 public:
 int unproblematisch;

[...problematischere Sachen...]

};

class Sohn: public Vater&lt;Sohn&gt;;
class Tochter: public Vater&lt;Tochter&gt;;

int main(){
 Sohn sohn;
 Tochter tochter;

 Vater *vater;   // Geht natürlich nicht

 if (zufallszahl==0) vater=&amp;sohn;
 else vater=&amp;tochter;

 vater-&gt;unproblematisch0;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/248581/basisklassenzeiger-auf-klassentemplate</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 22:00:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/248581.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 26 Aug 2009 17:57:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Basisklassenzeiger auf Klassentemplate? on Wed, 26 Aug 2009 17:57:25 GMT]]></title><description><![CDATA[<p>Hallo, ist wahrscheinlich ein dumme Frage, da ich weiß, dass das eigentlich nicht gehen sollte, aber vielleicht kennt ja jemand einen Trick dafür oder weiß ein besseres Design.</p>
<p>Gegeben folgende Klassenstruktur:</p>
<pre><code class="language-cpp">template&lt;typename&gt; class Vater;

class Sohn: public Vater&lt;Sohn&gt;;
class Tochter: public Vater&lt;Tochter&gt;;
</code></pre>
<p>Gibt es einen Weg, Objekte vom Typ Tochter und Sohn über einen gemeinsamen Zeiger anzusprechen? Naiv natürlich nicht, da Vater&lt;Sohn&gt; und Vater&lt;Tochter&gt; grundverschieden sein könnten. Aber ich als Programmierer weiß ja, dass die Unterschiede an der Codestelle an der ich das brauche nicht von Belang sind. Ich benutze nur Sachen, die nichtstatische Eigenschaften des Vater-Templates sind. Könnte man da vielleicht mit Mehrfachvererbung was tricksen?</p>
<p>Was ich vor habe:<br />
Abhängig vom ziehen einer Zufallszahl wird etwas mit einem Objekt vom Typ Tochter oder Sohn gemacht. In Pseudocode so:</p>
<pre><code class="language-cpp">template&lt;typename&gt; class Vater{
 public:
 int unproblematisch;

[...problematischere Sachen...]

};

class Sohn: public Vater&lt;Sohn&gt;;
class Tochter: public Vater&lt;Tochter&gt;;

int main(){
 Sohn sohn;
 Tochter tochter;

 Vater *vater;   // Geht natürlich nicht

 if (zufallszahl==0) vater=&amp;sohn;
 else vater=&amp;tochter;

 vater-&gt;unproblematisch0;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1767209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1767209</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 26 Aug 2009 17:57:25 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklassenzeiger auf Klassentemplate? on Wed, 26 Aug 2009 18:37:42 GMT]]></title><description><![CDATA[<p>Ich würde an Deiner Stelle nochmal ganz doll darüber nachdenken, was der Template-Parameter da soll und ob &quot;public inheritance&quot; überhaupt &quot;richtig&quot; verwendet wird.</p>
<p>Sonst kannst Du noch folgendes machen:</p>
<pre><code class="language-cpp">class GrossVater
{
protected:
  int unprob_;
public:
  int unprob() const {return unprob_;}
};

template&lt;typename T&gt;
class Vater : public GrossVater { ... };

...

Sohn s;
GrossVater* p = &amp;s;
p-&gt;unprob();
</code></pre>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1767231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1767231</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 26 Aug 2009 18:37:42 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklassenzeiger auf Klassentemplate? on Wed, 26 Aug 2009 19:01:35 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Ich würde an Deiner Stelle nochmal ganz doll darüber nachdenken, was der Template-Parameter da soll und ob &quot;public inheritance&quot; überhaupt &quot;richtig&quot; verwendet wird.</p>
</blockquote>
<p>Ja, habe ich schon gemacht, bevor ich so ein ungewöhnliches Konstrukt aufgesetzt habe. Es ist das, was in 99% Prozent der Fälle brauche, nur jetzt brauche ich einmal das hier beschriebene, wo das ganze nicht mehr so gut passt.</p>
<p>Das ich alles public gemacht habe hier im Beispiel war nur Schreibfaulheit.</p>
<blockquote>
<pre><code class="language-cpp">class GrossVater
{
protected:
  int unprob_;
public:
  int unprob() const {return unprob_;}
};

template&lt;typename T&gt;
class Vater : public GrossVater { ... };

...

Sohn s;
GrossVater* p = &amp;s;
p-&gt;unprob();
</code></pre>
</blockquote>
<p>Hehe, da hat mein Unterbewusstsein mit der Wahl der Familienmetapher wohl gar nicht so falsch gelegen. Danke für die Lösung.</p>
<p>Ich werde sie allerdings nicht verwenden, da es bei mir bereits einen Großvater gibt, der ebenfalls ein Template ist, jedoch hat mich das ganze auf eine ähnliche Idee gebracht, die bei mir passt:</p>
<pre><code class="language-cpp">class Großmutter{
public:
 int unproblematisch;
};

template&lt;typename&gt; class Vater: public Großvater&lt;Vater&lt;T&gt; &gt;, public Großmutter{
 };

class Sohn: public Vater&lt;Sohn&gt;;
class Tochter: public Vater&lt;Tochter&gt;;
</code></pre>
<p>Und dann einen Zeiger auf Großmutter verwenden. Finde ich irgendwie passend, denn mit dieser Metapher kommen alle Probleme aus der männlichen Seite der Verwandschaft <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/1767252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1767252</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 26 Aug 2009 19:01:35 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklassenzeiger auf Klassentemplate? on Wed, 26 Aug 2009 21:02:08 GMT]]></title><description><![CDATA[<p>Ein Vater <strong>ist</strong> ein Grossvater <em>und dann noch eine Grossmutter</em>? <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 />
Ihr solltet mal <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-75672.html" rel="nofollow">die Geschichte von Herrn Bebel</a> lesen.</p>
<p>P.S. Nicht ganz ernst zu nehmen. <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/1767349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1767349</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 26 Aug 2009 21:02:08 GMT</pubDate></item></channel></rss>