<?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[[erklärung] Klassen - Vererbung]]></title><description><![CDATA[<p>Hallo Gemeinde,</p>
<p>ich dachte eigentlich das ich das Thema verstanden habe, da ich das ja auch aktiv nutze, jedoch treten jetzt verhäuft Zweifel und Fragen auf.</p>
<p>Ich habe hier ein kleines Beispiel-Modul:</p>
<p><strong>class.h</strong></p>
<pre><code class="language-cpp">#ifndef CLASS_H_
#define CLASS_H_

class A
{
public:
	A() {};
	~A() {};
	void setNumberOne( int one );
	void setNumberTwo( int two );
	int getResult();
protected:
	int numberOne;
	int numberTwo;
	int numberResult;
	void calculate();
};

class B : public A
{
public:
	B( A instance );
	~B() {};
	void setNumberThree( int three );
private:
	int numberThree;
	A object;
protected:
	void calculate();
};

#endif /*CLASS_H_*/
</code></pre>
<p><strong>class.cpp</strong></p>
<pre><code class="language-cpp">#include &quot;class.h&quot;

void A::setNumberOne( int one )
{
	numberOne = one;
}

void A::setNumberTwo( int two )
{
	numberTwo = two;

	calculate();
}

void A::calculate()
{
	numberResult = numberOne + numberTwo;
}

int A::getResult()
{
	return numberResult;
}

B::B( A instance )
{
	object = instance;
}

void B::setNumberThree( int three )
{
	numberThree = three;

	calculate();
}

void B::calculate()
{
	numberResult = object.getResult() + numberThree;
}
</code></pre>
<p><strong>main.cpp</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;class/class.h&quot;

using namespace std;

int main()
{
	A a;

	a.setNumberOne(2);
	a.setNumberTwo(3);

	cout &lt;&lt; &quot;Result: &quot; &lt;&lt; a.getResult() &lt;&lt; &quot;\n&quot; &lt;&lt; endl;

	B b( a );
	b.setNumberThree(5);
	cout &lt;&lt; &quot;Result: &quot; &lt;&lt; b.getResult() &lt;&lt; &quot;\n&quot; &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Das Beispiel funktioniert und ist denke ich auch verständlich, so das ich da nicht näher darauf eingehen muss.</p>
<p><em>Farage1:</em><br />
Wie man sehen kann, gibt es</p>
<pre><code class="language-cpp">void A::calculate();
</code></pre>
<p>und</p>
<pre><code class="language-cpp">void B::calculate();
</code></pre>
<p>Die Funktion aus der Klasse B ist nur leicht verändert. Es ist ja so, das wenn man Funktionen bei der Vererbung überschreiben will, das diese mit</p>
<pre><code class="language-cpp">virtual
</code></pre>
<p>gekennzeichnet werden müssen. Warum funktioniert das bei mir ohne diese Kennzeichnung? Wozu sollte ich</p>
<pre><code class="language-cpp">virtual
</code></pre>
<p>nutzen?</p>
<p><em>Frage2:</em><br />
Ich habe es noch nie gebraucht oder besser gesagt noch nie benutzt. Die Klasse B leitet von A ab (public). Ich kann ja B auch von A als private ableiten, nur was bringt mir das? Ich habe festgestellt, das ich dann nicht mehr (von B aus) auf die Memberfunktion</p>
<pre><code class="language-cpp">int A::getResult();
</code></pre>
<p>zugreifen kann.</p>
<p><em>Bucherklärung zu Frage2:</em></p>
<blockquote>
<p>Ist die Sichtbarkeit der Vererbung privat, so erbt die Klasse B zwar die Funktionalität der Klasse A, sie erbt jedoch nach außen keine Verpflichtungen der Klasse A</p>
</blockquote>
<p>Damit ist bestimmt alles gesagt, jedoch begreife ich das nicht. Könnte mich da jemand erhellen?</p>
<p>Vielen Dank für die Hilfe</p>
<p>so long<br />
jd</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/215022/erklärung-klassen-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 13 Oct 2026 01:29:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/215022.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Jun 2008 14:45:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [erklärung] Klassen - Vererbung on Thu, 05 Jun 2008 14:45:00 GMT]]></title><description><![CDATA[<p>Hallo Gemeinde,</p>
<p>ich dachte eigentlich das ich das Thema verstanden habe, da ich das ja auch aktiv nutze, jedoch treten jetzt verhäuft Zweifel und Fragen auf.</p>
<p>Ich habe hier ein kleines Beispiel-Modul:</p>
<p><strong>class.h</strong></p>
<pre><code class="language-cpp">#ifndef CLASS_H_
#define CLASS_H_

class A
{
public:
	A() {};
	~A() {};
	void setNumberOne( int one );
	void setNumberTwo( int two );
	int getResult();
protected:
	int numberOne;
	int numberTwo;
	int numberResult;
	void calculate();
};

class B : public A
{
public:
	B( A instance );
	~B() {};
	void setNumberThree( int three );
private:
	int numberThree;
	A object;
protected:
	void calculate();
};

#endif /*CLASS_H_*/
</code></pre>
<p><strong>class.cpp</strong></p>
<pre><code class="language-cpp">#include &quot;class.h&quot;

void A::setNumberOne( int one )
{
	numberOne = one;
}

void A::setNumberTwo( int two )
{
	numberTwo = two;

	calculate();
}

void A::calculate()
{
	numberResult = numberOne + numberTwo;
}

int A::getResult()
{
	return numberResult;
}

B::B( A instance )
{
	object = instance;
}

void B::setNumberThree( int three )
{
	numberThree = three;

	calculate();
}

void B::calculate()
{
	numberResult = object.getResult() + numberThree;
}
</code></pre>
<p><strong>main.cpp</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;class/class.h&quot;

using namespace std;

int main()
{
	A a;

	a.setNumberOne(2);
	a.setNumberTwo(3);

	cout &lt;&lt; &quot;Result: &quot; &lt;&lt; a.getResult() &lt;&lt; &quot;\n&quot; &lt;&lt; endl;

	B b( a );
	b.setNumberThree(5);
	cout &lt;&lt; &quot;Result: &quot; &lt;&lt; b.getResult() &lt;&lt; &quot;\n&quot; &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Das Beispiel funktioniert und ist denke ich auch verständlich, so das ich da nicht näher darauf eingehen muss.</p>
<p><em>Farage1:</em><br />
Wie man sehen kann, gibt es</p>
<pre><code class="language-cpp">void A::calculate();
</code></pre>
<p>und</p>
<pre><code class="language-cpp">void B::calculate();
</code></pre>
<p>Die Funktion aus der Klasse B ist nur leicht verändert. Es ist ja so, das wenn man Funktionen bei der Vererbung überschreiben will, das diese mit</p>
<pre><code class="language-cpp">virtual
</code></pre>
<p>gekennzeichnet werden müssen. Warum funktioniert das bei mir ohne diese Kennzeichnung? Wozu sollte ich</p>
<pre><code class="language-cpp">virtual
</code></pre>
<p>nutzen?</p>
<p><em>Frage2:</em><br />
Ich habe es noch nie gebraucht oder besser gesagt noch nie benutzt. Die Klasse B leitet von A ab (public). Ich kann ja B auch von A als private ableiten, nur was bringt mir das? Ich habe festgestellt, das ich dann nicht mehr (von B aus) auf die Memberfunktion</p>
<pre><code class="language-cpp">int A::getResult();
</code></pre>
<p>zugreifen kann.</p>
<p><em>Bucherklärung zu Frage2:</em></p>
<blockquote>
<p>Ist die Sichtbarkeit der Vererbung privat, so erbt die Klasse B zwar die Funktionalität der Klasse A, sie erbt jedoch nach außen keine Verpflichtungen der Klasse A</p>
</blockquote>
<p>Damit ist bestimmt alles gesagt, jedoch begreife ich das nicht. Könnte mich da jemand erhellen?</p>
<p>Vielen Dank für die Hilfe</p>
<p>so long<br />
jd</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1523406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1523406</guid><dc:creator><![CDATA[jd]]></dc:creator><pubDate>Thu, 05 Jun 2008 14:45:00 GMT</pubDate></item><item><title><![CDATA[Reply to [erklärung] Klassen - Vererbung on Thu, 05 Jun 2008 14:57:23 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>auch ohne ein derart &quot;geschwätziges&quot; Beispiel <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="😉"
    /> kann man sagen: ohne &quot;virtual&quot; ist so ein Konstrukt selten das, was man wirklich will. Außerdem hast Du noch weitere Absonderlichkeiten da drin:<br />
1.) Ein Member vom Typ der Basisklasse ... warum eigentlich, wo doch ein B automatisch schon ein A-Subobjekt &quot;im Bauch&quot; hat ?<br />
2.) Ist Dir bewusst, dass im B-Ctor nur ein Kopie des übergebenen a-Objekts &quot;gezogen&quot; wird ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1523413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1523413</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 05 Jun 2008 14:57:23 GMT</pubDate></item><item><title><![CDATA[Reply to [erklärung] Klassen - Vererbung on Thu, 05 Jun 2008 15:11:51 GMT]]></title><description><![CDATA[<p>Ja, das ist mir beides klar... mir geht es aber nicht darum wie zweckdienlich das ist, oder ob was kopiert wird oder nicht. Mir geht es um die Problematik mit virtual. Wie ich in meinem ersten Beitrag oben schon geschrieben habe und um die private Vererbung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1523433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1523433</guid><dc:creator><![CDATA[jd]]></dc:creator><pubDate>Thu, 05 Jun 2008 15:11:51 GMT</pubDate></item><item><title><![CDATA[Reply to [erklärung] Klassen - Vererbung on Thu, 05 Jun 2008 16:35:08 GMT]]></title><description><![CDATA[<p>jd schrieb:</p>
<blockquote>
<p>Wozu sollte ich</p>
<pre><code class="language-cpp">virtual
</code></pre>
<p>nutzen?</p>
</blockquote>
<pre><code class="language-cpp">class A
{
	public:
		virtual void a( ) { std::cout &lt;&lt; &quot;Klasse A&quot; &lt;&lt; std::endl; }
};

class B : public A
{
	public:
		virtual void a( ) { std::cout &lt;&lt; &quot;Klasse B&quot; &lt;&lt; std::endl; }
};

class C : public A
{
	public:
		virtual void a( ) { std::cout &lt;&lt; &quot;Klasse C&quot; &lt;&lt; std::endl; }
};

int main()
{
	A* pobj;		// Zeiger vom Typ A erstellen
	pobj = new B;
	pobj-&gt;a( );		// Ausgabe: &quot;Klasse B&quot;( ohne das Schlüsselwort virtual, würde hier &quot;Klasse A&quot; aufgerufen )
	delete pobj;

	pobj = new C;
	pobj-&gt;a( );             // Ausgabe &quot;Klasse C&quot;

	delete pobj;

}
</code></pre>
<p>-&gt; kurzum: virtuelle Funktionen definieren Schnittstellen für<br />
alle abgeleiteten Klassen ihres Typs( auch wenn diese bei der Festlegung der Basisklasse<br />
noch unbekannt sind )</p>
<p>jd schrieb:</p>
<blockquote>
<p>~A() {};</p>
</blockquote>
<p>Ausserdem sollte bei Abstrakten Klassen der Destruktor immer virtuell sein.</p>
<p>jd schrieb:</p>
<blockquote>
<p>Ich kann ja B auch von A als private ableiten, nur was bringt mir das?</p>
</blockquote>
<p>meinst du damit eine Implementationsvererbung?<br />
Dies würde dann so aussehen:</p>
<pre><code class="language-cpp">class A
{
	public:
		void c( ) { std::cout &lt;&lt; &quot;funktion c&quot; &lt;&lt; std::endl; }
		void d( ) { std::cout &lt;&lt; &quot;funktion d&quot; &lt;&lt; std::endl; }
};
class B : private A
{
	public:
		using A::c; // diesmal wird nicht die Schnittstelle, sondern die Implementierung geerbt( nur die Funktion c )
};
/*class C : public B // dieses Objekt würde die funktion c nicht beinhalten
{
};*/
int main()
{	
	B b;
	b.c( );	// b.d( ) ist nicht möglich, da nur die funktion c vererbt wurde

}
</code></pre>
<p>-&gt; Bei Privater Vererbung darf die Unterklasse die Funktion benutzen, die Objekte dieser aber nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1523464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1523464</guid><dc:creator><![CDATA[double *T]]></dc:creator><pubDate>Thu, 05 Jun 2008 16:35:08 GMT</pubDate></item><item><title><![CDATA[Reply to [erklärung] Klassen - Vererbung on Fri, 06 Jun 2008 07:30:10 GMT]]></title><description><![CDATA[<p>Danke für die Erklärung jetzt wird mir einiges klarer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1523820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1523820</guid><dc:creator><![CDATA[jd]]></dc:creator><pubDate>Fri, 06 Jun 2008 07:30:10 GMT</pubDate></item></channel></rss>