<?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[Gleiche Funktion in verschiedenen Klassen aufrufen.]]></title><description><![CDATA[<p>Hi liebe Gemeinde.</p>
<p>Vereinfachtes Beispiel:<br />
Ich hab zwei Klassen ClassA und ClassB. Beide besitzen die Funktion print(). Jetzt möchte ich NUR EINE Variable anlegen, die entweder von Typ ClassA oder ClassB ist und die printfunktion darüber aufrufen.</p>
<p>so etwa in der Art:</p>
<pre><code>#include &lt;iostream&gt;

using namespace std;

class classA
{
	public:
		int a1;

	classA()
	{
		a1 = 21;
	}

	void print()
	{
		std::cout &lt;&lt; &quot;a1=&quot; &lt;&lt; a1 &lt;&lt; std::endl;
	}
};

class classB
{
	public:
		int b1;

	classB()
        {
		b1 = 31;
	}

	void print()
	{
		std::cout &lt;&lt; &quot;b1=&quot; &lt;&lt; b1 &lt;&lt; std::endl;
	}
};

int main(int argc, char* argv[])
{
	int i = 0;

	void *myClass;

	switch(i)
	{
		case 0:	myClass = new classA(); break;
		case 1: myClass = new classB();break;
	}

	myClass-&gt;print();
}
</code></pre>
<p>Könnt ihr mir da auf den rechten Weg helfen?</p>
<p>Gruß Tobi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323579/gleiche-funktion-in-verschiedenen-klassen-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 20:11:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323579.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 05 Feb 2014 15:15:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Wed, 05 Feb 2014 15:15:35 GMT]]></title><description><![CDATA[<p>Hi liebe Gemeinde.</p>
<p>Vereinfachtes Beispiel:<br />
Ich hab zwei Klassen ClassA und ClassB. Beide besitzen die Funktion print(). Jetzt möchte ich NUR EINE Variable anlegen, die entweder von Typ ClassA oder ClassB ist und die printfunktion darüber aufrufen.</p>
<p>so etwa in der Art:</p>
<pre><code>#include &lt;iostream&gt;

using namespace std;

class classA
{
	public:
		int a1;

	classA()
	{
		a1 = 21;
	}

	void print()
	{
		std::cout &lt;&lt; &quot;a1=&quot; &lt;&lt; a1 &lt;&lt; std::endl;
	}
};

class classB
{
	public:
		int b1;

	classB()
        {
		b1 = 31;
	}

	void print()
	{
		std::cout &lt;&lt; &quot;b1=&quot; &lt;&lt; b1 &lt;&lt; std::endl;
	}
};

int main(int argc, char* argv[])
{
	int i = 0;

	void *myClass;

	switch(i)
	{
		case 0:	myClass = new classA(); break;
		case 1: myClass = new classB();break;
	}

	myClass-&gt;print();
}
</code></pre>
<p>Könnt ihr mir da auf den rechten Weg helfen?</p>
<p>Gruß Tobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381650</guid><dc:creator><![CDATA[tobi_from_HH]]></dc:creator><pubDate>Wed, 05 Feb 2014 15:15:35 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Wed, 05 Feb 2014 15:20:06 GMT]]></title><description><![CDATA[<p>tobi_from_HH schrieb:</p>
<blockquote>
<p>Hi liebe Gemeinde.</p>
<p>Vereinfachtes Beispiel:<br />
Ich hab zwei Klassen ClassA und ClassB. Beide besitzen die Funktion print(). Jetzt möchte ich NUR EINE Variable anlegen, die entweder von Typ ClassA oder ClassB ist und die printfunktion darüber aufrufen.</p>
<p>Könnt ihr mir da auf den rechten Weg helfen?</p>
<p>Gruß Tobi</p>
</blockquote>
<p>Das Stichwort, das Du brauchst ist <strong>virtual</strong>.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381651</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Wed, 05 Feb 2014 15:20:06 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Wed, 05 Feb 2014 15:33:17 GMT]]></title><description><![CDATA[<p>Wie soll das genau gehen? Ich hab ja keine abgeleitete Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381656</guid><dc:creator><![CDATA[tobi_from_HH]]></dc:creator><pubDate>Wed, 05 Feb 2014 15:33:17 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Wed, 05 Feb 2014 15:53:20 GMT]]></title><description><![CDATA[<p>tobi_from_HH schrieb:</p>
<blockquote>
<p>Wie soll das genau gehen? Ich hab ja keine abgeleitete Klasse.</p>
</blockquote>
<p>Das geht halt nur mit abgeleiteten Klassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381660</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 05 Feb 2014 15:53:20 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Wed, 05 Feb 2014 16:05:45 GMT]]></title><description><![CDATA[<p>Einfach beide Klassen von einer abstrakten Basisklasse mit Printfunktion ableiten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381664</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Wed, 05 Feb 2014 16:05:45 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Wed, 05 Feb 2014 16:17:39 GMT]]></title><description><![CDATA[<p>TNA schrieb:</p>
<blockquote>
<p>Einfach beide Klassen von einer abstrakten Basisklasse mit Printfunktion ableiten</p>
</blockquote>
<p>Dann kann ich aber nicht auf die Daten der erbenden Klasse zugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381666</guid><dc:creator><![CDATA[tobi_from_HH]]></dc:creator><pubDate>Wed, 05 Feb 2014 16:17:39 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Wed, 05 Feb 2014 16:23:58 GMT]]></title><description><![CDATA[<p>tobi_from_HH schrieb:</p>
<blockquote>
<p>TNA schrieb:</p>
<blockquote>
<p>Einfach beide Klassen von einer abstrakten Basisklasse mit Printfunktion ableiten</p>
</blockquote>
<p>Dann kann ich aber nicht auf die Daten der erbenden Klasse zugreifen.</p>
</blockquote>
<p>Deswegen ja auch virtual!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381668</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 05 Feb 2014 16:23:58 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Wed, 05 Feb 2014 16:24:15 GMT]]></title><description><![CDATA[<p>tobi_from_HH schrieb:</p>
<blockquote>
<p>TNA schrieb:</p>
<blockquote>
<p>Einfach beide Klassen von einer abstrakten Basisklasse mit Printfunktion ableiten</p>
</blockquote>
<p>Dann kann ich aber nicht auf die Daten der erbenden Klasse zugreifen.</p>
</blockquote>
<p>Warum nicht? Natürlich geht das. Mußt halt casten. Das hättest Du aber mit deiner void* Lösung auch machen müssen. Hier kannst Du sogar typsicher casten (Stichwort dynamic_cast)</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381669</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Wed, 05 Feb 2014 16:24:15 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Wed, 05 Feb 2014 16:44:22 GMT]]></title><description><![CDATA[<p>tobi_from_HH schrieb:</p>
<blockquote>
<p>TNA schrieb:</p>
<blockquote>
<p>Einfach beide Klassen von einer abstrakten Basisklasse mit Printfunktion ableiten</p>
</blockquote>
<p>Dann kann ich aber nicht auf die Daten der erbenden Klasse zugreifen.</p>
</blockquote>
<p>Auf b1 bzw. a1 kannst du dann nicht zugreifen, das ist richtig. Das ist dynamisch aber nicht (bzw. kaum) möglich.*<br />
Wenn du Zugriff brauchst, schreib dir auch eine virtuelle get-Funktion. Wenn die Member von verschiedenen Typen sind, musst du downcasten. Das ist aber fast immer ein Zeichen von schlechtem Design, also solltest du dann dein Design überdenken.</p>
<p>* Edit: Um das deutlicher auszudrücken: Es ist unmöglich einfach eine Variable zu erstellen, die ist entweder a oder b und dann einfach so behandeln, als wär sie eine von beiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381670</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 05 Feb 2014 16:44:22 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Wed, 05 Feb 2014 16:39:08 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>Warum nicht? Natürlich geht das. Mußt halt casten. Das hättest Du aber mit deiner void* Lösung auch machen müssen. Hier kannst Du sogar typsicher casten (Stichwort dynamic_cast)</p>
</blockquote>
<p>Warum ein typisches Zeichen für Designfehler als Vorschlag? Hier spricht doch alles für eine abstrakte Basisklasse. Kein Grund, hier irgendwelche dynamic_casts einzubauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381675</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 05 Feb 2014 16:39:08 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Thu, 06 Feb 2014 00:01:15 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>mgaeckler schrieb:</p>
<blockquote>
<p>Warum nicht? Natürlich geht das. Mußt halt casten. Das hättest Du aber mit deiner void* Lösung auch machen müssen. Hier kannst Du sogar typsicher casten (Stichwort dynamic_cast)</p>
</blockquote>
<p>Warum ein typisches Zeichen für Designfehler als Vorschlag? Hier spricht doch alles für eine abstrakte Basisklasse. Kein Grund, hier irgendwelche dynamic_casts einzubauen.</p>
</blockquote>
<p>Vielleicht habe ich die Anforderung falsch verstanden. Ich dachte da an sowas:</p>
<pre><code>class base
{
	public:
	virtual void print() = 0;
};

class derivedA : public base
{
	public:
	double myDblValue;

	deriveA()
	{
		myDblValue = 3.14;
	}

	virtual void print()
	{
		cout &lt;&lt; myDblValue;
	}
}

class derivedB : public base
{
	public:
	int myIntValue;

	deriveA()
	{
		myIntValue = 3;
	}

	virtual void print()
	{
		cout &lt;&lt; myIntValue;
	}
}

int main( void )
{
	base *ptr;

	ptr = new ......;

	ptr-&gt;print();

	derivedA *aPtr = dynamic_cast&lt;derivedA *&gt;ptr;

	if( aPtr )
		cout &lt;&lt; aPtr-&gt;myIntValue;

	derivedB *bPtr = dynamic_cast&lt;derivedB *&gt;ptr;

	if( bPtr )
		cout &lt;&lt; aPtr-&gt;myDblValue;

	return 0;		
}
</code></pre>
<p>Das ist jetzt kein compilierbarer Code, man möge mir daher Tippfehler verzeihen. Es soll nur demonstrieren wie man mit dynamic_cast oder virtuellen Funktionen das selbe Ergebnis erzielen kann. Selbstverständlich ist in diesem konkreten Beispiel die virtuelle Funktion vorzuziehen, aber die Aufgabenstellung war ja nicht spezifisch genug um abschliesend urteilen zu können, ob dynamic_cast nicht auch eine sinnvolle Option wäre.</p>
<p>Ich finde der Einsatz von dynamic_cast ist nicht sofort ein Zeichen für einen Designfehler.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381735</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Thu, 06 Feb 2014 00:01:15 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Thu, 06 Feb 2014 00:52:08 GMT]]></title><description><![CDATA[<blockquote>
<p>aber die Aufgabenstellung war ja nicht spezifisch genug um abschliesend urteilen zu können, ob dynamic_cast nicht auch eine sinnvolle Option wäre.</p>
<p>Ich finde der Einsatz von dynamic_cast ist nicht sofort ein Zeichen für einen Designfehler.</p>
</blockquote>
<p>Wenn kein GUTER Grund gegen die Verwendung von virtuellen Funktionen spricht, dann schon <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="😉"
    /><br />
Wenn ein solcher, wie gesagt GUTER, Grund nicht angegeben wurde, dann halte ich es daher auch für nicht angebracht <code>dynamic_cast</code> zu erwähnen.</p>
<p>OK, von mir aus in einem Nebensatz dass das auch möglich wäre. Aber primär sollten bei der Fragestellung erstmal virtuelle Funktionen erwähnt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381736</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 06 Feb 2014 00:52:08 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Thu, 06 Feb 2014 07:18:59 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>OK, von mir aus in einem Nebensatz dass das auch möglich wäre. Aber primär sollten bei der Fragestellung erstmal virtuelle Funktionen erwähnt werden.</p>
</blockquote>
<p>Richtig, deswegen war ja auch <code>virtual</code> mein <strong>erster</strong> Vorschlag.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381743</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Thu, 06 Feb 2014 07:18:59 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Thu, 06 Feb 2014 09:57:58 GMT]]></title><description><![CDATA[<p>Upps, sorry, übersehen <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/2381769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381769</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 06 Feb 2014 09:57:58 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Thu, 06 Feb 2014 10:37:44 GMT]]></title><description><![CDATA[<p>dynamic_cast funktioniert nur bei Zeigern oder Referenzen auf Klassen. Einen void* kann man mit dynamic_cast nicht casten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381779</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Thu, 06 Feb 2014 10:37:44 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion in verschiedenen Klassen aufrufen. on Thu, 06 Feb 2014 11:44:04 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>dynamic_cast funktioniert nur bei Zeigern oder Referenzen auf Klassen. Einen void* kann man mit dynamic_cast nicht casten.</p>
</blockquote>
<p>Richtig, das ist ein weiterer Grund, warum der Threadesteller gar nicht um eine Basisklasse herumkommt. Bei seiner Idee mit einem void * hätte er nämlich 'nen normalen cast benutzen müssen und sowas ist immer gefährlich und sollte nur mit bedacht benutzt werden.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2381794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2381794</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Thu, 06 Feb 2014 11:44:04 GMT</pubDate></item></channel></rss>