<?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[Abgeleitete Klassen und private-Zugriffsrecht auf Eigentschaften]]></title><description><![CDATA[<p>Krug zum Gruße,</p>
<p>ich lese gerade den in diesem Forum für Neulinge empfohlenen C++ Kurs von Wolfgang Schröder und habe gerade die Übung des Kapitels über virtuelle Memberfunktoinen geschrieben <a href="http://www.cpp-tutor.de/cpp/le15/virt_memfunk.html#beispiel" rel="nofollow">Übung des Kapitels über virtuelle Memberfunktoinen</a> (die Übung ist ganz unten auf der Seite.</p>
<p>Das war soweit auch kein Problem, allerdings hab ich folgendes noch nicht 100% verstanden:<br />
Wenn ich von einer Basisklasse eine SubKlasse ableite, so erhält diese alle Eigenschaften und Memberfunktionen der Basisklasse.<br />
Wird über private, protected und public nur das Zugriffsrecht auf die entsprechenden Member definiert, oder werden beispielsweise als private deklarierte Eigenschaften garnicht erst vererbt?<br />
Soweit ich das verstanden hab werden sie vererbt, aber auf sie besteht eben dann kein Zugriff.<br />
Arbeite ich allerdings mit virtuellen Funktionen und später mit einem Pointer vom Typ der Basisklasse, so kann ich doch auch auf die ursprügnlich als private deklarierten member zugreifen, wenn ich die entsprechende Anfrage immer an die Basisklasse weiterleite.</p>
<p>Ich hab die Übung folgendermassen geschrieben:<br />
HEADER</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#ifndef _MYWinBase_
#define _MYWinBase_
//-----WinBase------
class WinBase {
private:
	int width, height;
	int xpos, ypos;
protected:
	WinBase();
	WinBase(int xpos, int ypos, int height, int width);
public:
	virtual void PrintProperties (void) const;
	virtual ~WinBase()=0;
};

//-----Window-------
class Window: public WinBase {
protected:
	std::string beschriftung;
public:
	Window (std::string titel);
	Window (int xpos, int ypos, int height, int width, std::string titel);
	~Window ();
	void PrintProperties (void) const;
};

//-----Button-------
class Button: public Window {
private:
	int buttonID;
	static int idcounter;
public :
	Button (std::string titel);
	Button (int xpos, int ypos, int height, int width, std::string titel);
	~Button ();
	void PrintProperties (void) const;
};
#endif
</code></pre>
<p>und Definitionen + main-Fkt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;test.h&quot;

//____DEFINITIONEN___________
//-----WinBase------
WinBase::WinBase():width(200),height(100),xpos(10),ypos(10) {
}
WinBase::WinBase(int xpos, int ypos, int height, int width)
		  :width(width),height(height),xpos(xpos),ypos(ypos) {
}
WinBase::~WinBase() {
	std::cout&lt;&lt;&quot;WinBase dtor\n&quot;;
}
void WinBase::PrintProperties() const {
	std::cout&lt;&lt;&quot;Position: (&quot;&lt;&lt;xpos&lt;&lt;&quot;,&quot;&lt;&lt;ypos&lt;&lt;&quot;)\n&quot;
			 &lt;&lt;&quot;Groesse: (&quot;&lt;&lt;height&lt;&lt;&quot;,&quot;&lt;&lt;width&lt;&lt;&quot;)\n&quot;;
}

//-----Window-------
Window::Window(std::string titel):WinBase(),beschriftung(titel) {}
Window::Window(int xpos, int ypos, int height, int width, std::string titel)
		:WinBase(xpos, ypos,height,width),beschriftung(titel) {}
Window::~Window() {
	std::cout&lt;&lt;&quot;Window dtor\n&quot;;
}
void Window::PrintProperties() const {
	WinBase::PrintProperties();
	std::cout&lt;&lt;&quot;Beschriftung: &quot;&lt;&lt;beschriftung&lt;&lt;&quot;\n&quot;;
}

//-----Button-------
int Button::idcounter = 0;
Button::Button(std::string titel):Window(titel),buttonID(++Button::idcounter) {}
Button::Button(int xpos, int ypos, int height, int width, std::string titel)
	:Window(xpos, ypos,height,width,titel),buttonID(++Button::idcounter) {}
Button::~Button() {
	--Button::idcounter;
	std::cout&lt;&lt;&quot;Button dtor\n&quot;;
}
void Button::PrintProperties() const {
	Window::PrintProperties();
	std::cout&lt;&lt;&quot;Button-ID: &quot;&lt;&lt;buttonID&lt;&lt;&quot;\n&quot;;
}
//____ENDE_DEFINITIONEN______

int main()
{
	WinBase * p[2];
	Button tmpObj(&quot;moep&quot;);
	std::string titel(&quot;Fenstertitel&quot;);
	std::string titel2(&quot;Buttontitel&quot;);
	p[0] = new Window(10,10,200,100,titel);
	p[1] = new Button(50,50,100,50,titel2);
	p[0]-&gt;PrintProperties();
	p[1]-&gt;PrintProperties();

	delete p[0];
	delete p[1];

	std::cin.get();
}
</code></pre>
<p>Ich hoffe das war jetzt nicht zuviel code. Die Eigenschaften von WinBase (xpos,ypos, height und width) sind ja als private deklariert. Daher können Instanzen von Window oder Button nicht direkt darauf zugreifen, aber die PrintPropterties der jeweiligen Basisklasse aufrufen, bis ich eben in WindowBase ankomme. Diese kann dann die Eigenschaften ausgeben.</p>
<p>Um also die Frage auf den Punkt zu bringen: Die Eigenschaften ansich existieren für Instanzen von Window und Button, nur haben sie keinen Zugriff darauf? Oder seh ich da noch was falsch?</p>
<p>P.S.: Huch, hatte zu Testzwecken eben noch die Eigenschaften in WinBase als protected deklariert - sollte natürlich private sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274058/abgeleitete-klassen-und-private-zugriffsrecht-auf-eigentschaften</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 20:02:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274058.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Sep 2010 17:02:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Abgeleitete Klassen und private-Zugriffsrecht auf Eigentschaften on Sat, 18 Sep 2010 17:05:27 GMT]]></title><description><![CDATA[<p>Krug zum Gruße,</p>
<p>ich lese gerade den in diesem Forum für Neulinge empfohlenen C++ Kurs von Wolfgang Schröder und habe gerade die Übung des Kapitels über virtuelle Memberfunktoinen geschrieben <a href="http://www.cpp-tutor.de/cpp/le15/virt_memfunk.html#beispiel" rel="nofollow">Übung des Kapitels über virtuelle Memberfunktoinen</a> (die Übung ist ganz unten auf der Seite.</p>
<p>Das war soweit auch kein Problem, allerdings hab ich folgendes noch nicht 100% verstanden:<br />
Wenn ich von einer Basisklasse eine SubKlasse ableite, so erhält diese alle Eigenschaften und Memberfunktionen der Basisklasse.<br />
Wird über private, protected und public nur das Zugriffsrecht auf die entsprechenden Member definiert, oder werden beispielsweise als private deklarierte Eigenschaften garnicht erst vererbt?<br />
Soweit ich das verstanden hab werden sie vererbt, aber auf sie besteht eben dann kein Zugriff.<br />
Arbeite ich allerdings mit virtuellen Funktionen und später mit einem Pointer vom Typ der Basisklasse, so kann ich doch auch auf die ursprügnlich als private deklarierten member zugreifen, wenn ich die entsprechende Anfrage immer an die Basisklasse weiterleite.</p>
<p>Ich hab die Übung folgendermassen geschrieben:<br />
HEADER</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#ifndef _MYWinBase_
#define _MYWinBase_
//-----WinBase------
class WinBase {
private:
	int width, height;
	int xpos, ypos;
protected:
	WinBase();
	WinBase(int xpos, int ypos, int height, int width);
public:
	virtual void PrintProperties (void) const;
	virtual ~WinBase()=0;
};

//-----Window-------
class Window: public WinBase {
protected:
	std::string beschriftung;
public:
	Window (std::string titel);
	Window (int xpos, int ypos, int height, int width, std::string titel);
	~Window ();
	void PrintProperties (void) const;
};

//-----Button-------
class Button: public Window {
private:
	int buttonID;
	static int idcounter;
public :
	Button (std::string titel);
	Button (int xpos, int ypos, int height, int width, std::string titel);
	~Button ();
	void PrintProperties (void) const;
};
#endif
</code></pre>
<p>und Definitionen + main-Fkt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;test.h&quot;

//____DEFINITIONEN___________
//-----WinBase------
WinBase::WinBase():width(200),height(100),xpos(10),ypos(10) {
}
WinBase::WinBase(int xpos, int ypos, int height, int width)
		  :width(width),height(height),xpos(xpos),ypos(ypos) {
}
WinBase::~WinBase() {
	std::cout&lt;&lt;&quot;WinBase dtor\n&quot;;
}
void WinBase::PrintProperties() const {
	std::cout&lt;&lt;&quot;Position: (&quot;&lt;&lt;xpos&lt;&lt;&quot;,&quot;&lt;&lt;ypos&lt;&lt;&quot;)\n&quot;
			 &lt;&lt;&quot;Groesse: (&quot;&lt;&lt;height&lt;&lt;&quot;,&quot;&lt;&lt;width&lt;&lt;&quot;)\n&quot;;
}

//-----Window-------
Window::Window(std::string titel):WinBase(),beschriftung(titel) {}
Window::Window(int xpos, int ypos, int height, int width, std::string titel)
		:WinBase(xpos, ypos,height,width),beschriftung(titel) {}
Window::~Window() {
	std::cout&lt;&lt;&quot;Window dtor\n&quot;;
}
void Window::PrintProperties() const {
	WinBase::PrintProperties();
	std::cout&lt;&lt;&quot;Beschriftung: &quot;&lt;&lt;beschriftung&lt;&lt;&quot;\n&quot;;
}

//-----Button-------
int Button::idcounter = 0;
Button::Button(std::string titel):Window(titel),buttonID(++Button::idcounter) {}
Button::Button(int xpos, int ypos, int height, int width, std::string titel)
	:Window(xpos, ypos,height,width,titel),buttonID(++Button::idcounter) {}
Button::~Button() {
	--Button::idcounter;
	std::cout&lt;&lt;&quot;Button dtor\n&quot;;
}
void Button::PrintProperties() const {
	Window::PrintProperties();
	std::cout&lt;&lt;&quot;Button-ID: &quot;&lt;&lt;buttonID&lt;&lt;&quot;\n&quot;;
}
//____ENDE_DEFINITIONEN______

int main()
{
	WinBase * p[2];
	Button tmpObj(&quot;moep&quot;);
	std::string titel(&quot;Fenstertitel&quot;);
	std::string titel2(&quot;Buttontitel&quot;);
	p[0] = new Window(10,10,200,100,titel);
	p[1] = new Button(50,50,100,50,titel2);
	p[0]-&gt;PrintProperties();
	p[1]-&gt;PrintProperties();

	delete p[0];
	delete p[1];

	std::cin.get();
}
</code></pre>
<p>Ich hoffe das war jetzt nicht zuviel code. Die Eigenschaften von WinBase (xpos,ypos, height und width) sind ja als private deklariert. Daher können Instanzen von Window oder Button nicht direkt darauf zugreifen, aber die PrintPropterties der jeweiligen Basisklasse aufrufen, bis ich eben in WindowBase ankomme. Diese kann dann die Eigenschaften ausgeben.</p>
<p>Um also die Frage auf den Punkt zu bringen: Die Eigenschaften ansich existieren für Instanzen von Window und Button, nur haben sie keinen Zugriff darauf? Oder seh ich da noch was falsch?</p>
<p>P.S.: Huch, hatte zu Testzwecken eben noch die Eigenschaften in WinBase als protected deklariert - sollte natürlich private sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954181</guid><dc:creator><![CDATA[inter2k3]]></dc:creator><pubDate>Sat, 18 Sep 2010 17:05:27 GMT</pubDate></item><item><title><![CDATA[Reply to Abgeleitete Klassen und private-Zugriffsrecht auf Eigentschaften on Sat, 18 Sep 2010 17:28:28 GMT]]></title><description><![CDATA[<p>Abgeleitete Klassen können nicht auf private Member zugreifen. Nur auf protected Member. Mach Dir nen getter() ansonsten oder deklarier sie protected.<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954191</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 18 Sep 2010 17:28:28 GMT</pubDate></item><item><title><![CDATA[Reply to Abgeleitete Klassen und private-Zugriffsrecht auf Eigentschaften on Sat, 18 Sep 2010 17:46:07 GMT]]></title><description><![CDATA[<p>Das ist mir soweit klar.</p>
<p>Da ich aber die Eigenschaften (in meinem Beispiel) als private deklariert habe, kann z.b. eine Button-Instanz nicht auf diese Werte zugreifen.<br />
Was ich mich jetzt frage ist, ob die Eigenschaften für ein Button-Objekt trotzdem abgespeichert werden (also trotz private-Deklaration), nur eben nicht abrufbar.<br />
Wenn ich wie im Beispiel aber immer die Abfrage an die Basisklasse delegiere (bis zu der Basisklasse, in der die Eigenscahften deklariert weren), dann kann ich sie dort ja trotzdem ausgeben.</p>
<p>Mir ist klar, dass ich das so normalerweise nicht umsetzen würde sondern mit get- und set-Memberfunktionen arbeiten würde. Allerdings müssten dafür trotzdem in der WinBase Klasse die Eigenschaften als protected deklariert werden, da sonst auch die getter und setter ja keinen Zugriff darauf hätten.</p>
<p>Meine Frage eigentlich: Werden als private deklarierte Eigenschaften trotzdem vererbt, nur eben so, dass sie nicht abgerufen werden können? Der Button speichert ja trotzdem seine Position und Grösse, welche ja durch PrintProperties (welche eben immer weiter hoch-deligiert wird) ja ausgegeben werden können?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954199</guid><dc:creator><![CDATA[inter2k3]]></dc:creator><pubDate>Sat, 18 Sep 2010 17:46:07 GMT</pubDate></item><item><title><![CDATA[Reply to Abgeleitete Klassen und private-Zugriffsrecht auf Eigentschaften on Sun, 19 Sep 2010 11:15:00 GMT]]></title><description><![CDATA[<p>inter2k3 schrieb:</p>
<blockquote>
<p>Meine Frage eigentlich: Werden als private deklarierte Eigenschaften trotzdem vererbt, nur eben so, dass sie nicht abgerufen werden können? Der Button speichert ja trotzdem seine Position und Grösse, welche ja durch PrintProperties (welche eben immer weiter hoch-deligiert wird) ja ausgegeben werden können?</p>
</blockquote>
<p>Klar. Diese Eigenschaft ist dann aber Teil der Basisklasse.</p>
<p>Du kannst ja immernoch die Funktionen der Basisklasse über die abgeleitete Klasse aufrufen und dafür braucht es ja die Informationen.</p>
<p>Eine Klasse, welche von einer anderen erbt erweitert diese üblicherweise (abgesehen von Adaptern o.ä., wie z.B <code>std::stack</code> , welche lediglich ein wohl bekanntes Interface anbietet). Und da sie erweitert sind die Daten essentiell.</p>
<p>Zugriffsrechte ändern nichts am eigentlich generierten Code, sondern sind lediglich eine Information für dem Compiler, damit er unerlaubte Sachen gleich bemängeln kann. Zur Laufzeit wird es keine Informationen mehr dazu geben (vom Compiler abhängig, wäre aber imo sinnlos), ob eine Member <code>public</code> oder <code>private</code> war.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954315</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 19 Sep 2010 11:15:00 GMT</pubDate></item></channel></rss>