<?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[Frage zur Vererbung]]></title><description><![CDATA[<p>Also ich habe eine Klasse A, die ich in Header und Source aufgeteilt habe. Ich möchte nun von ihrem Header eine Klasse B ableiten. Nun sind aber die Methoden der Wurzelklasse A in der Source-Datei von A implementiert.</p>
<p>Wie löse ich dieses Problem? Muss ich sie einfach in den Source von B kopieren oder geht das irgendwie eleganter?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/247008/frage-zur-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 19:28:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/247008.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Aug 2009 21:10:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zur Vererbung on Tue, 04 Aug 2009 21:10:14 GMT]]></title><description><![CDATA[<p>Also ich habe eine Klasse A, die ich in Header und Source aufgeteilt habe. Ich möchte nun von ihrem Header eine Klasse B ableiten. Nun sind aber die Methoden der Wurzelklasse A in der Source-Datei von A implementiert.</p>
<p>Wie löse ich dieses Problem? Muss ich sie einfach in den Source von B kopieren oder geht das irgendwie eleganter?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755390</guid><dc:creator><![CDATA[skullyan]]></dc:creator><pubDate>Tue, 04 Aug 2009 21:10:14 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Vererbung on Tue, 04 Aug 2009 21:27:15 GMT]]></title><description><![CDATA[<p>Was spielt es für B eine Rolle, wo die Implementierung von A ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755402</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 04 Aug 2009 21:27:15 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Vererbung on Tue, 04 Aug 2009 21:27:27 GMT]]></title><description><![CDATA[<p>skullyan schrieb:</p>
<blockquote>
<p>Also ich habe eine Klasse A, die ich in Header und Source aufgeteilt habe. Ich möchte nun von ihrem Header eine Klasse B ableiten. Nun sind aber die Methoden der Wurzelklasse A in der Source-Datei von A implementiert.</p>
<p>Wie löse ich dieses Problem? Muss ich sie einfach in den Source von B kopieren oder geht das irgendwie eleganter?</p>
</blockquote>
<p>Verstehe ich nicht. Vielleicht kannst du ja kurz ein funktionsfähiges Codebeispiel zeigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755403</guid><dc:creator><![CDATA[asdasdasd]]></dc:creator><pubDate>Tue, 04 Aug 2009 21:27:27 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Vererbung on Tue, 04 Aug 2009 21:30:29 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">// A.h

/* HEADERGUARDS */

class A {
public:
    A(int wert): m_ichBinA(wert) { }
    void huiWert();
protected:
    int m_ichBinA;
};

/* HEADERGUARDS */
</code></pre>
<pre><code class="language-cpp">// A.cpp
#include &quot;A.h&quot;
#include &lt;iostream&gt;

void A::huiWert()
{
    std::cout &lt;&lt; m_ichBinA &lt;&lt; std::endl;
}
</code></pre>
<pre><code class="language-cpp">// B.h

/* HEADERGUARDS */

class B: public A {
    // blah blah, geht doch, oder was genau ist dein Problem?
};

/* HEADERGUARDS */
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1755404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755404</guid><dc:creator><![CDATA[LP @ Ferropolis]]></dc:creator><pubDate>Tue, 04 Aug 2009 21:30:29 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Vererbung on Tue, 04 Aug 2009 21:31:59 GMT]]></title><description><![CDATA[<p>Heck, hab natürlich ein:</p>
<pre><code class="language-cpp">#include &quot;A.h&quot;
</code></pre>
<p>im <code>B.h</code> vergessen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755407</guid><dc:creator><![CDATA[LP @ Ferropolis]]></dc:creator><pubDate>Tue, 04 Aug 2009 21:31:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Vererbung on Tue, 04 Aug 2009 22:04:37 GMT]]></title><description><![CDATA[<p>LP @ Ferropolis schrieb:</p>
<blockquote>
<p>Heck, hab natürlich ein:</p>
<pre><code class="language-cpp">#include &quot;A.h&quot;
</code></pre>
<p>im <code>B.h</code> vergessen</p>
</blockquote>
<p>Du musst auch den Konstruktor noch aufrufen:</p>
<pre><code class="language-cpp">// [...]

class B: public A {
 public:
  B(int wert) : A(wert) { }
};

// [...]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1755416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755416</guid><dc:creator><![CDATA[asdasdasdasd]]></dc:creator><pubDate>Tue, 04 Aug 2009 22:04:37 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Vererbung on Tue, 04 Aug 2009 22:18:53 GMT]]></title><description><![CDATA[<p>LP @ Ferropolis schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// A.h

/* HEADERGUARDS */

class A {
public:
    A(int wert): m_ichBinA(wert) { }
    void huiWert();
protected:
    int m_ichBinA;
};

/* HEADERGUARDS */
</code></pre>
<pre><code class="language-cpp">// A.cpp
#include &quot;A.h&quot;
#include &lt;iostream&gt;

void A::huiWert()
{
    std::cout &lt;&lt; m_ichBinA &lt;&lt; std::endl;
}
</code></pre>
<pre><code class="language-cpp">// B.h

/* HEADERGUARDS */

class B: public A {
    // blah blah, geht doch, oder was genau ist dein Problem?
};

/* HEADERGUARDS */
</code></pre>
</blockquote>
<p>Ja geht, aber ein Objekt vom Typ B kann <code>A::huiWert();</code> nicht aufrufen, weil ja nur der Header von A inkludiert ist. Dadurch ist huiWert(); nur deklariert, oder sehe ich das falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755420</guid><dc:creator><![CDATA[skullyan]]></dc:creator><pubDate>Tue, 04 Aug 2009 22:18:53 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Vererbung on Tue, 04 Aug 2009 22:29:11 GMT]]></title><description><![CDATA[<p>Klar kann er das. Du sagst dem Compiler mit der Vorwärtsdeklaration lediglich, dass diese Funktion irgendwo definiert ist. Und der Linker macht dann die Funktion auch für andere Übersetzungseinheiten bekannt.<br />
Wenn du jetzt mal die Definition weglässt, wirst du feststellen, dass der Compiler immernoch zufrieden ist. Aber der Linker findet dann die Definition der Funktion nicht. (sofern du irgendwo versuchst sie aufzurufen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755427</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 04 Aug 2009 22:29:11 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Vererbung on Tue, 04 Aug 2009 23:01:09 GMT]]></title><description><![CDATA[<p>Das ist der Header der Wurzelklasse SERVER:</p>
<pre><code class="language-cpp">#ifndef _SERVER_
#define _SERVER_
#include &lt;iostream&gt;
#include &lt;windows.h&gt;
#include &lt;winsock.h&gt;

using namespace std;

class SERVER
{
private:
	WSADATA wsa;
	struct sockaddr_in srv, cli;
	SOCKET s, c;
	int cli_size;
	char port[80];
	fd_set rfds;
	struct timeval tv;
	int retval;

public:	
	SERVER()
	{};
	~SERVER()
	{
		closesocket(s);
	}
	bool sockInit();
	bool buildSock();
	void structWrite();
	bool zuhoeren();
	bool acceptk();
};
#endif
</code></pre>
<p>Das ist die Quelldatei von derselben:</p>
<pre><code class="language-cpp">#include &quot;SERVER.h&quot;

bool SERVER::sockInit()
{
		    /* initialize windows sockets */
    if (WSAStartup(MAKEWORD(1, 1), &amp;wsa))
    {
        cout &lt;&lt; &quot;WSAStartup() failed: &quot; &lt;&lt; (unsigned long)GetLastError() &lt;&lt; endl;
        return EXIT_FAILURE;
    }
	cli_size = sizeof(sockaddr_in);
	return true;
}

bool SERVER::buildSock()
{
	s = socket(AF_INET, SOCK_STREAM, 0);
	if (s == -1)
	{
		cerr &lt;&lt; &quot;socket() failed&quot; &lt;&lt; endl;
	}
	return true;
}
bool SERVER::zuhoeren()
{
	if (listen(s, 3) == -1)
	{
		cerr &lt;&lt; &quot;listen() failed&quot; &lt;&lt; endl;
		return EXIT_FAILURE;
	}
	return true;
}

void SERVER::structWrite()
{
	cout &lt;&lt; &quot;Bitte Port eingeben: &quot; &lt;&lt; endl;
	cin &gt;&gt; port;
	srv.sin_addr.s_addr = INADDR_ANY;
	srv.sin_port = htons( (unsigned short int) atol(port));
	srv.sin_family = AF_INET;
	if (bind(s, (struct sockaddr*)&amp;srv, sizeof(srv)) == -1)
	{
		cerr &lt;&lt; &quot;bind() failed&quot; &lt;&lt; endl;
		return ;
	}
}
bool SERVER::acceptk()
{
	for(int i = 0;;)
	{
		Sleep(200);
		c = accept(s, (struct sockaddr*)&amp;cli, (int*)cli_size);
		i++;
		if(i&lt; 5)
			break;
	}
	/*if (c == -1)
	{
		cerr &lt;&lt; &quot;accept() failed&quot; &lt;&lt; endl;
		return false;
	}*/
	cout &lt;&lt; &quot;client from &quot; &lt;&lt; inet_ntoa(cli.sin_addr) &lt;&lt; endl;

	/* Watch stdin (fd 0) to see when it has input. */
	FD_ZERO(&amp;rfds);
	FD_SET(0, &amp;rfds);
/* Wait up to five seconds. */
	tv.tv_sec = 5;
	tv.tv_usec = 0;
	retval = select(1, &amp;rfds, NULL, NULL, &amp;tv); /* Don’t rely on the value of tv now! */
	if (retval)
		cout &lt;&lt; &quot;Data is available now.\n&quot; &lt;&lt; endl; /* FD_ISSET(0, &amp;rfds) will be true. */
	else
		cout &lt;&lt; &quot;No data within five seconds.\n&quot; &lt;&lt; endl;
	return true;

}
// Deklaration von Funktionstemplate
/*
template&lt;class T&gt;
inline T pow(T&amp;);
*/
int main(int argc, char **argv)
{
	SERVER ser;
	ser.sockInit();
	if (argc != 1)
	{
		cerr &lt;&lt; &quot;usage: port\n&quot; &lt;&lt; &quot;SERVER&quot; &lt;&lt; endl;
		return 1;
	}
	ser.buildSock();
	ser.structWrite();
	ser.zuhoeren();
	ser.acceptk();
	/*
	cout &lt;&lt; &quot;Bitte geben Sie eine Zahl ein. Diese wird dann potenziert ausgegeben: &quot;;
	cin &gt;&gt; a;
	cout &lt;&lt; &quot;Die Potenz der eingegebenen Zahl betraegt: &quot; &lt;&lt; pow(a) &lt;&lt; endl;
	char* Datei = new char[66]; //allokierung eines arrays mit 66 zeichen
	delete[] Datei;
	*/
	cin.sync();
	cin.get();
	return 0;
}
/*
template&lt;class T&gt;
inline T pow(T&amp; a)
{
	return a*a;
}
*/
</code></pre>
<p><code>Und das ist meine abgeleitete Klasse Client:</code></p>
<pre><code class="language-cpp">#include &quot;klie.h&quot;

void CLIENT::ausgeben()const
{
	cout &lt;&lt; &quot;hallo&quot; &lt;&lt; endl;
}
bool SERVER::sockInit()
{
		    /* initialize windows sockets */
    if (WSAStartup(MAKEWORD(1, 1), &amp;wsa))
    {
        cout &lt;&lt; &quot;WSAStartup() failed: &quot; &lt;&lt; (unsigned long)GetLastError() &lt;&lt; endl;
        return EXIT_FAILURE;
    }
	cli_size = sizeof(sockaddr_in);
	return true;
}

bool SERVER::buildSock()
{
	s = socket(AF_INET, SOCK_STREAM, 0);
	if (s == -1)
	{
		cerr &lt;&lt; &quot;socket() failed&quot; &lt;&lt; endl;
	}
	return true;
}
bool SERVER::zuhoeren()
{
	if (listen(s, 3) == -1)
	{
		cerr &lt;&lt; &quot;listen() failed&quot; &lt;&lt; endl;
		return EXIT_FAILURE;
	}
	return true;
}

void SERVER::structWrite()
{
	cout &lt;&lt; &quot;Bitte Port eingeben: &quot; &lt;&lt; endl;
	cin &gt;&gt; port;
	srv.sin_addr.s_addr = INADDR_ANY;
	srv.sin_port = htons( (unsigned short int) atol(port));
	srv.sin_family = AF_INET;
	if (bind(s, (struct sockaddr*)&amp;srv, sizeof(srv)) == -1)
	{
		cerr &lt;&lt; &quot;bind() failed&quot; &lt;&lt; endl;
		return ;
	}
}
bool SERVER::acceptk()
{
	for(int i = 0;;)
	{
		Sleep(200);
		c = accept(s, (struct sockaddr*)&amp;cli, (int*)cli_size);
		i++;
		if(i&lt; 5)
			break;
	}
	return true;
}
int main()
{
	CLIENT kli;
	kli.acceptk();
	kli.ausgeben();
	cin.get();
	return 0;
}
</code></pre>
<p>In diesem Fall funktioniert die Vererbung. Aber ich musste die implementierung der Methoden erst <strong>vom Source des Servers in den Source vom Client hineinkopieren.</strong><br />
Meine Frage war daher, ob es so üblich ist, denn wenn ich auch noch die SERVER.cpp-Sourcedatei in den Header von Client einfüge, bekomme ich natürlich die Fehlermeldung, dass <code>main()</code> nicht überladen werden darf xD</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755430</guid><dc:creator><![CDATA[skullyan]]></dc:creator><pubDate>Tue, 04 Aug 2009 23:01:09 GMT</pubDate></item></channel></rss>