<?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[Klasse]]></title><description><![CDATA[<pre><code class="language-cpp">class A {

public : 

funk();

}

class B:public A {

public:

funktion();

}

int main() {

B objekt;
A* ptr =&amp;objekt;

}
</code></pre>
<p>Also obwohl das Objekt die memberfunktion Funktion hat, kann der Zeiger ptr<br />
nicht draufzugreifen. Ist doch auch irgendwie blöd oder ?? warum nimmt<br />
man nicht einfach einen B* ptr ?? Der Compiler meckert jedenfalls bei<br />
beiden nicht. Jedenfalls kann ich über ptr-&gt;funktion() nicht zugreifen obwohl<br />
objekt diese Funktion hat</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/269795/klasse</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Apr 2026 10:52:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269795.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Jul 2010 10:39:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klasse on Thu, 01 Jul 2010 10:39:39 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class A {

public : 

funk();

}

class B:public A {

public:

funktion();

}

int main() {

B objekt;
A* ptr =&amp;objekt;

}
</code></pre>
<p>Also obwohl das Objekt die memberfunktion Funktion hat, kann der Zeiger ptr<br />
nicht draufzugreifen. Ist doch auch irgendwie blöd oder ?? warum nimmt<br />
man nicht einfach einen B* ptr ?? Der Compiler meckert jedenfalls bei<br />
beiden nicht. Jedenfalls kann ich über ptr-&gt;funktion() nicht zugreifen obwohl<br />
objekt diese Funktion hat</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1919840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919840</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Thu, 01 Jul 2010 10:39:39 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse on Thu, 01 Jul 2010 10:43:53 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Das ist nunmal so. Woher soll A denn die Funktionen von B kennen. Wenn es unbedingt sein muss kann man ja casten.<br />
Welche Frage hast du jetzt genau?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1919844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919844</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 01 Jul 2010 10:43:53 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse on Thu, 01 Jul 2010 10:48:21 GMT]]></title><description><![CDATA[<p>blurry333 schrieb:</p>
<blockquote>
<p>warum nimmt<br />
man nicht einfach einen B* ptr ??</p>
</blockquote>
<p>Ja, das solltest du dann auch machen, wenn du Funktionen nutzen willst, die nur für B sinnvoll sind.<br />
Sind die Funktionen auch für A's sinnvoll, dann muss die Funktion halt schon in A sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1919846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919846</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Thu, 01 Jul 2010 10:48:21 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse on Thu, 01 Jul 2010 10:57:44 GMT]]></title><description><![CDATA[<p>Hiho,</p>
<p>hierbei ist es so, dass der Datentyp des Pointers (A) ausschlaggebend ist,<br />
und 'A' kennt nun mal keine Methode namens &quot;funktion&quot;,<br />
deshalb müsstest du casten.</p>
<p>In deinem Fall solltest du sogar</p>
<pre><code class="language-cpp">B* ptr =&amp;objekt;
</code></pre>
<p>nehmen, da deine Basisklasse nicht Polymorph ist und die beiden Methoden auch unterschiedliche Namen haben.</p>
<p>Davon abgesehn solltest du dir nochmals die Syntax anschauen,<br />
und dein Quellcode ordentlich gestalten, d.h. u.a. einrücken:</p>
<pre><code class="language-cpp">class A
{
    public:
        void funk() {}
};

class B:public A
{
    public:
        void funktion() {}
};

int main()
{
    B objekt;
    A* ptr =&amp;objekt;

    return 0;
}
</code></pre>
<p>hoff das hilft <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1919849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919849</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 01 Jul 2010 10:57:44 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse on Thu, 01 Jul 2010 11:02:38 GMT]]></title><description><![CDATA[<p>blurry333 schrieb:</p>
<blockquote>
<p>Also obwohl das Objekt die memberfunktion Funktion hat, kann der Zeiger ptr nicht draufzugreifen. Ist doch auch irgendwie blöd oder ?? warum nimmt man nicht einfach einen B* ptr ??</p>
</blockquote>
<p>Deine Frage scheint mit etwas anderer Natur zu sein, vermutlich hast du ähnliches in irgendwelchen Code gesehen.</p>
<p>Wenn man einen Basisklassenzeiger verwendet, tut man dies in der Regel aus guten Grund, und in Zusammenhang mit Polymorphie (mehrere Klassen teilen sich eine gemeinsame Schnittstelle, und werden über diese gemeinsame Schnittstelle verwendet). In deinen Beispiel macht dies kein Sinn, aber mit virtuellen Funktionen (und entweder einem virtuellen, oder einen privaten Destruktor in der Basisklasse) schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1919851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919851</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 01 Jul 2010 11:02:38 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse on Thu, 01 Jul 2010 11:10:05 GMT]]></title><description><![CDATA[<p>wenn beide klassen die methode funk() hätten<br />
und ich in der Basisklasse diese Methode virtual mache,<br />
dann kann ein Basisklassenzeiger plötzlich trotzdem drauf<br />
zugriefen obwohl er grundsätzlich diese funktion in der abgeleiteten klasse<br />
gar nicht kennt. Aber auf andere funktionen in der abgeleiteten klasse<br />
kann er nicht zugreifen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1919854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919854</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Thu, 01 Jul 2010 11:10:05 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse on Thu, 01 Jul 2010 11:31:37 GMT]]></title><description><![CDATA[<p>hiho,</p>
<p>Wenn eine Klasse min.1 virtuelle Methode hat, dann ist sie polymorph.<br />
Es wird nun erst zur Laufzeit entschieden, welche Methode schlussendlich aufgerufen wird (late binding).</p>
<p>Virtuelle Methoden können von der Subklasse überschrieben werden.<br />
Ist dies der Fall, wird die Methode der Subklasse aufgerufen (late binding).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1919860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919860</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 01 Jul 2010 11:31:37 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse on Thu, 01 Jul 2010 12:03:09 GMT]]></title><description><![CDATA[<p>blurry333 schrieb:</p>
<blockquote>
<p>wenn beide klassen die methode funk() hätten<br />
und ich in der Basisklasse diese Methode virtual mache,<br />
dann kann ein Basisklassenzeiger plötzlich trotzdem drauf<br />
zugriefen obwohl er grundsätzlich diese funktion in der abgeleiteten klasse<br />
gar nicht kennt. Aber auf andere funktionen in der abgeleiteten klasse<br />
kann er nicht zugreifen?</p>
</blockquote>
<p>Bitte unterlasse das umbrechen per Return inmitten von Absätzen, das Forum bricht automatisch um.</p>
<p>Grundsätzlich ist ein Zeiger erst einmal nur eine Adresse und zeigt auf einen bestimmten Typ. Der Zeiger selbst weiß nicht, ob du ihn eine Abgeleitete Klasse vorsetzt - ansonsten müsste er alle Methoden aller Klassen die von diesem Typ abgeleitet werden anbieten, und das wäre Schwachsinn.</p>
<p>Bei virtuellen Methoden wird aber immer die &quot;richtige&quot; Methode ausgeführt, sprich die, die ausgehend von der Konkreten Klasse am &quot;nächsten&quot; implementiert wurde. Bei einer nicht virtuellen Methode wird über den Zeigertyp die passende gewählt (Sprich die Methode die vom Typ auf den der Zeiger verweist ausgehend die &quot;nächst&quot; höhere ist). Ich verdeutliche dies mal wie folgt:</p>
<pre><code class="language-cpp">class A
{
    public:
        virtual ~A() {}
        void foo1() { std::cout &lt;&lt; &quot;A::foo1\n&quot;; }
        virtual foo2() { std::cout &lt;&lt; &quot;A::foo2\n&quot;; }
};

class B : public A
{
    public:
        void foo1() { std::cout &lt;&lt; &quot;B::foo1\n&quot;; }
        virtual foo2() { std::cout &lt;&lt; &quot;B::foo2\n&quot;; }
};

class C : public B
{
    public:
}

class D : public C
{
    public:
        void foo1() { std::cout &lt;&lt; &quot;D::foo1\n&quot;; }
        virtual foo2() { std::cout &lt;&lt; &quot;D::foo2\n&quot;; }
}

// Aus Gründen der einfachheit verwende ich hier eine Referenz, kann
// man aber auch mit einen Zeiger machen.
void doFooA(
    A &amp; a)
{
    a.foo1();
    a.foo2();
}

void doFooC(
    C &amp; a)
{
    c.foo1();
    c.foo2();
}

int main()
{
    A a;
    B b;
    C c;
    D d;
    doFooA(a);
    doFooA(b);
    doFooA(c);
    doFooA(d);
    doFooC(c);
    doFooC(d);
}
</code></pre>
<p>Ergebnis von doFooA: Bei foo1 immer die &quot;A::foo1&quot; Ausgabe, und bei foo2 A, B, B, D (C hat keine eigene, daher die nächste [B] in der Hierarchie nach oben).</p>
<p>Ergebnis von doFooB: Bei foo1 immer die &quot;B::foo1&quot; Ausgabe [nächste von C aus in der Hierarchie nach oben], und bei foo2 B, D (C hat keine eigene, daher die nächste [B]).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1919881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919881</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 01 Jul 2010 12:03:09 GMT</pubDate></item></channel></rss>