<?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[konflikt zwischen statischem und dynamischen Polymorphismus]]></title><description><![CDATA[<p>Hallo Leute, ich hab da ne generelle Frage. Hab ein kleines Beispiel für mein Problem zusammengestellt:</p>
<pre><code>#include &lt;iostream&gt;

class figure
{
 protected:
	short m_height;
 	short m_width;
  public:
	//getter
	short height() { return m_height;}
	//abstract setter
	virtual void height(short h)=0;
};

class rectangle: public figure
{
  public:
	//setter	
	void height(short h) { m_height=h;}
};

class quad: public figure
{
  public:
	//setter
	void height(short hw) {m_height=m_width=hw; }
};

int main()
{
	//Compiliert:
	figure* myf=new quad;
	myf-&gt;height(5);
	std::cout &lt;&lt; myf-&gt;height() &lt;&lt; std::endl;

	quad* myq=new quad;
	myq-&gt;height(4);
	/*
	Das folgende nicht:
	main.c:43: error: no matching function for call to 'quad::height()'
	main.c:26: note: candidates are: virtual void quad::height(short int)
	*/
	std::cout &lt;&lt; myq-&gt;height() &lt;&lt; std::endl;

	/*
	Dies ist ein workaround:
	*/	
	std::cout &lt;&lt; myq-&gt;figure::height() &lt;&lt; std::endl;
	return 0;
}
</code></pre>
<p>Es geht darum, Getter und Setter durch statische Polymorphie zu lösen (gleicher Funktionsname, unterschiedliche Signatur)</p>
<p>Wenn nun meine abstrakte Basisklasse eine Getter Methode implementiert, die SetterMethode aber virtuell sind und von den Abgeleiteten Klassen implementiert werden, findet der Compiler die Methode der Basisklasse nicht mehr.</p>
<p>Oben habe ich ein workaround gezeigt, eine andere Möglichkeit wäre es, Setter und Getter virtuell zu machen und von allen Abgeleiteten Klassen implementieren lassen. Das führt natürlich zu doppeltem Code und will ich nicht.</p>
<p>Ahja, die triviale Lösung &quot;GetHeight und SetHeight&quot; gilt nicht <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>Was für eine Erklärung habt ihr für obiges Verhalten?</p>
<p>Gruß andy :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/167368/konflikt-zwischen-statischem-und-dynamischen-polymorphismus</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 23:42:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/167368.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 10 Dec 2006 13:35:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to konflikt zwischen statischem und dynamischen Polymorphismus on Sun, 10 Dec 2006 13:36:42 GMT]]></title><description><![CDATA[<p>Hallo Leute, ich hab da ne generelle Frage. Hab ein kleines Beispiel für mein Problem zusammengestellt:</p>
<pre><code>#include &lt;iostream&gt;

class figure
{
 protected:
	short m_height;
 	short m_width;
  public:
	//getter
	short height() { return m_height;}
	//abstract setter
	virtual void height(short h)=0;
};

class rectangle: public figure
{
  public:
	//setter	
	void height(short h) { m_height=h;}
};

class quad: public figure
{
  public:
	//setter
	void height(short hw) {m_height=m_width=hw; }
};

int main()
{
	//Compiliert:
	figure* myf=new quad;
	myf-&gt;height(5);
	std::cout &lt;&lt; myf-&gt;height() &lt;&lt; std::endl;

	quad* myq=new quad;
	myq-&gt;height(4);
	/*
	Das folgende nicht:
	main.c:43: error: no matching function for call to 'quad::height()'
	main.c:26: note: candidates are: virtual void quad::height(short int)
	*/
	std::cout &lt;&lt; myq-&gt;height() &lt;&lt; std::endl;

	/*
	Dies ist ein workaround:
	*/	
	std::cout &lt;&lt; myq-&gt;figure::height() &lt;&lt; std::endl;
	return 0;
}
</code></pre>
<p>Es geht darum, Getter und Setter durch statische Polymorphie zu lösen (gleicher Funktionsname, unterschiedliche Signatur)</p>
<p>Wenn nun meine abstrakte Basisklasse eine Getter Methode implementiert, die SetterMethode aber virtuell sind und von den Abgeleiteten Klassen implementiert werden, findet der Compiler die Methode der Basisklasse nicht mehr.</p>
<p>Oben habe ich ein workaround gezeigt, eine andere Möglichkeit wäre es, Setter und Getter virtuell zu machen und von allen Abgeleiteten Klassen implementieren lassen. Das führt natürlich zu doppeltem Code und will ich nicht.</p>
<p>Ahja, die triviale Lösung &quot;GetHeight und SetHeight&quot; gilt nicht <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>Was für eine Erklärung habt ihr für obiges Verhalten?</p>
<p>Gruß andy :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1189488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1189488</guid><dc:creator><![CDATA[wwwAndy]]></dc:creator><pubDate>Sun, 10 Dec 2006 13:36:42 GMT</pubDate></item><item><title><![CDATA[Reply to konflikt zwischen statischem und dynamischen Polymorphismus on Sun, 10 Dec 2006 13:56:10 GMT]]></title><description><![CDATA[<p>Mach einfache Weiterleitungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1189495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1189495</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sun, 10 Dec 2006 13:56:10 GMT</pubDate></item><item><title><![CDATA[Reply to konflikt zwischen statischem und dynamischen Polymorphismus on Sun, 10 Dec 2006 20:09:41 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Mach einfache Weiterleitungen.</p>
</blockquote>
<p>Na gut, noch ein Work-around.<br />
Ich möchte wissen, ob das nun ein Compilerfehler ist, ob man den Compiler mir irgendwelchen flags so parametrieren kann, dass er das doch versteht, oder ob das man generell statischen und dynamischen Polymorphismus mixen sollte?</p>
<p>Gruß Andy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1189755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1189755</guid><dc:creator><![CDATA[wwwAndy]]></dc:creator><pubDate>Sun, 10 Dec 2006 20:09:41 GMT</pubDate></item><item><title><![CDATA[Reply to konflikt zwischen statischem und dynamischen Polymorphismus on Sun, 10 Dec 2006 22:26:23 GMT]]></title><description><![CDATA[<p>Du hast es praktisch herausgefordert, statische Polymorphie, in dem du gleichname Memberfunktionen in deiner Klasse hast. Es ist also dein Entscheidung gewesen, und mußt damit leben. Oder du änderst es. <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>myq-&gt;figure::height() ist ja kein Workaround, es ist ein Sprachmerkmal, mit dem dem explizit eine Funktion in einem anderen Namensraum (in dem Fall figure) benennst. Es ist nichts &quot;schmutziges&quot;. Ich halte es aber für den Benutzer der Klasse umständlich. Du könntest den Benutzer unter die Arme greifen, in dem Du heigh() in den abgeleiteten Klassen implementierst und nur weiterleitest.</p>
<p>Aber das Design würde ich unabhängig von dem Problem nochmal überdenken. Dreiecke, Kreise usw. haben zwar eine &quot;virtuelles&quot; viereckige Dimension, aber diese würde ein Benutzer niemals über hight oder width setzen. Für einen Kreis gibt man nen Durchmesser oder Radius an. Dein bisheriges Design ist nicht wirklich zukunftssicher. <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>Dann würde ich ich über eine Klasse nachdenken, die nur Breite/Höhe anbietet, die für die virtuelle Dimension da ist. (obwohl man die auch on the fly errechnen könnte)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1189814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1189814</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sun, 10 Dec 2006 22:26:23 GMT</pubDate></item><item><title><![CDATA[Reply to konflikt zwischen statischem und dynamischen Polymorphismus on Mon, 11 Dec 2006 07:14:04 GMT]]></title><description><![CDATA[<p>wwwAndy schrieb:</p>
<blockquote>
<p>Ich möchte wissen, ob das nun ein Compilerfehler ist, ob man den Compiler mir irgendwelchen flags so parametrieren kann, dass er das doch versteht, oder ob das man generell statischen und dynamischen Polymorphismus mixen sollte?</p>
</blockquote>
<p>Das hat afaik nichts mit statisch vs. dynamisch zu tun. Das hängt einfach damit zusammen, daß die Überladungs-Auflösung nur innerhalb eines gegebenen Scopes definiert ist - dadurch, daß du eine rectangle::height() definiert hast, werden die Methoden der Basisklasse nicht mehr in die Suche einbezogen.</p>
<p>Zur Lösung kannst du entweder eine Weiterleitung zur Basisfunktion anlegen, den beiden Methoden verschiedene Namen geben oder die Basisfunktion per &quot;using&quot; bekanntmachen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1189880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1189880</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 11 Dec 2006 07:14:04 GMT</pubDate></item><item><title><![CDATA[Reply to konflikt zwischen statischem und dynamischen Polymorphismus on Mon, 11 Dec 2006 10:47:33 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>Aber das Design würde ich unabhängig von dem Problem nochmal überdenken. Dreiecke, Kreise usw. haben zwar eine &quot;virtuelles&quot; viereckige Dimension, aber diese würde ein Benutzer niemals über hight oder width setzen. Für einen Kreis gibt man nen Durchmesser oder Radius an. Dein bisheriges Design ist nicht wirklich zukunftssicher. <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>Ich habe oben geschrieben: &quot;Habe ein Beispiel für mein Problem zusammengestellt&quot;, damit es hier überschaubar bleibt. Die reale Anwendung ist eine Client-Server Geschichte mit CORBA, speziell TAO (The ACE Orb, ACE=Adaptive Communication Environment) und FLTK (<a href="http://www.fltk.org" rel="nofollow">www.fltk.org</a>) und hat mittlerweile über 12000 Zeilen Code. Das wollte ich hier nicht posten... Und gerade FLTK verwendet statische Polymorphie für Getter und Setter Methoden, daran kann ich also nichts ändern. Das CORBA Konzept mit C++ hingegen macht massiven Gebrauch von abstrakten Basisklassen und Mehrfachvererbung.</p>
<p>Du verzeihst mir also, dass ich das &quot;Problem&quot; auf ein einfaches Beispiel minimiert habe?</p>
<p>Gruß Andy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1189991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1189991</guid><dc:creator><![CDATA[wwwAndy]]></dc:creator><pubDate>Mon, 11 Dec 2006 10:47:33 GMT</pubDate></item><item><title><![CDATA[Reply to konflikt zwischen statischem und dynamischen Polymorphismus on Mon, 11 Dec 2006 10:49:04 GMT]]></title><description><![CDATA[<p>Achso... <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1189994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1189994</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Mon, 11 Dec 2006 10:49:04 GMT</pubDate></item></channel></rss>