<?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[Interfaces wie in Java?]]></title><description><![CDATA[<p>Hallo!<br />
Ist es in C++ irgendwie möglich, Interfaces<br />
analog zu Java in eine Klasse einzubinden?<br />
Problem ist, dass verschiedene Klassen, die<br />
von wiederum von verschiedenen Klassen abstammen<br />
können, eine gemeinsame Programmschnittstelle<br />
besitzen sollen.<br />
Ich möchte also im Programm ein Objekt erstellen,<br />
das in meinem Fall z.B. verschiedene Monochromatoren<br />
mit einem Satz bekannter Funktionen ansteuert.<br />
Dabe gehe ich von einem vorgegebenen &quot;Vererbungsbaum&quot;<br />
aus, also nach dem Motto<br />
- &quot;jeder Monochromator ist ein Gerät&quot; aber<br />
- &quot;nicht jedes Gerät ist ein Monochromator&quot;<br />
usw.</p>
<p>Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/129394/interfaces-wie-in-java</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 06:06:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/129394.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 13 Dec 2005 11:57:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 11:57:13 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ist es in C++ irgendwie möglich, Interfaces<br />
analog zu Java in eine Klasse einzubinden?<br />
Problem ist, dass verschiedene Klassen, die<br />
von wiederum von verschiedenen Klassen abstammen<br />
können, eine gemeinsame Programmschnittstelle<br />
besitzen sollen.<br />
Ich möchte also im Programm ein Objekt erstellen,<br />
das in meinem Fall z.B. verschiedene Monochromatoren<br />
mit einem Satz bekannter Funktionen ansteuert.<br />
Dabe gehe ich von einem vorgegebenen &quot;Vererbungsbaum&quot;<br />
aus, also nach dem Motto<br />
- &quot;jeder Monochromator ist ein Gerät&quot; aber<br />
- &quot;nicht jedes Gerät ist ein Monochromator&quot;<br />
usw.</p>
<p>Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940943</guid><dc:creator><![CDATA[LionAM]]></dc:creator><pubDate>Tue, 13 Dec 2005 11:57:13 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 11:59:21 GMT]]></title><description><![CDATA[<p>Ja, Mehrfachvererbung (damit kannst du sogar die Funktionalität verschiedener Klassen zusammenpacken) und (rein) virtuelle Funktionen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940947</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 13 Dec 2005 11:59:21 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 12:05:05 GMT]]></title><description><![CDATA[<pre><code class="language-java">interface Foo
{
    int bar(bool foobar);
}
</code></pre>
<pre><code class="language-cpp">class Foo
{
    virtual int bar(bool foobar) = 0;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/940956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940956</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Tue, 13 Dec 2005 12:05:05 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 12:13:05 GMT]]></title><description><![CDATA[<p>Man sollte wohl doch nicht zu weit denken<br />
wollen. Nur weil Java keine Mehrfachvererbung<br />
kannte, heißt das ja noch lange nicht, dass<br />
C++ das auch nicht kann...<br />
Danke.</p>
<p>Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/940968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/940968</guid><dc:creator><![CDATA[LionAM]]></dc:creator><pubDate>Tue, 13 Dec 2005 12:13:05 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 13:09:03 GMT]]></title><description><![CDATA[<p>Kann Java mittlerweile Mehrfachvererbung, weil du schreibst &quot;kannte&quot;? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Der Ansatz von Java mit Schnittstellen und Klassendefinitionen hat man soweit ich weiss bewusst der Mehrfachvererbung vorgezogen, da die Mehrfachvererbung nicht ganz unproblematisch ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941010</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Tue, 13 Dec 2005 13:09:03 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 13:16:50 GMT]]></title><description><![CDATA[<p>Aha, was ist denn problematisch daran? Im übrigen, es gibt mittlerweile java-basierte Sprachen, wie CaesarJ, die eben genau diese Defizite kompensieren. Mit CaesarJ kann man nämlich Mehrfachvererbung in seine Java-Programme einbringen.</p>
<p>Aber lassen wir das! Er hat jetzt sein &quot;Problem&quot; gelöst bekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941026</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 13 Dec 2005 13:16:50 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 13:42:27 GMT]]></title><description><![CDATA[<p>Ich würde die Mehrfachvererbung in Java nicht als Fortschritt sehen, sondern eher als Konzeptbruch. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
Durch die Verwendung von Interfaces sind virutelle Ableitungen überflüssig. Außerdem werden solche Sachen vermieden:</p>
<pre><code class="language-cpp">class A 
{
   virtual int foo () { return 0;}
};

class B : virtual public A 
{
   virtual int foo () { return 1;}
};

class C : virtual public A
{
   virtual int foo () { return 2;}
};

class D : public B, public C
{}

int main ()
{
    D Test;
    int iWert = Test.foo ();
}
</code></pre>
<p>Welchen Wert hat iWert?</p>
<p>(Damit du mich nicht missverstehst, finde die Mehrfachvererbung sehr nützlich aber wenn man nicht genau weiss was man tut kann man da böse auf die Nase fallen.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941050</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Tue, 13 Dec 2005 13:42:27 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 13:45:35 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10111">@Mathias</a>: Was soll das sein? So etwas kompiliert doch gar nicht!!!</p>
<p>Das folgende kompiliert, und es sollte klar sein, was passiert!</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class A
{
public:
	virtual int foo () { return 0;}
};

class B : virtual public A
{
public:
   virtual int foo () { return 1;}
};

class C : virtual public A
{
public:
   virtual int foo () { return 2;}
};

class D : public B, public C
{
public:
	virtual int foo()
	{
		cout &lt;&lt; A::foo() &lt;&lt; endl;
		cout &lt;&lt; B::foo() &lt;&lt; endl;
		return C::foo();
	}
};

int main ()
{
    D Test;
    cout &lt;&lt; Test.foo() &lt;&lt; endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/941060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941060</guid><dc:creator><![CDATA[schorsch code]]></dc:creator><pubDate>Tue, 13 Dec 2005 13:45:35 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 13:52:26 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10111">@mathias</a>: dein &quot;tolles&quot; Bsp. dürfte nen Fehler beim Kompilieren bringen wegen Mehrdeutigkeit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/941070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941070</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Tue, 13 Dec 2005 13:52:26 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 14:05:14 GMT]]></title><description><![CDATA[<p>Sollte meine Beipsiele vorher austesten. *grummel* Sorry Leuts, schlechtes Beispiel.<br />
(Hatte das Beispiel warum man das virtuelle Ableiten braucht im Kopf und hab das auf virtuelle-Funktionen übertragen und nicht bedacht, dass der Compiler das erkennen kann.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941075</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Tue, 13 Dec 2005 14:05:14 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 14:11:10 GMT]]></title><description><![CDATA[<p>Meld dich wieder, wenn du auch einen Grund hast. Ist das gleiche wie, als mich ein Kunde gefragt hat, ob man auch die Buttons in der Toolbar ändern kann, nachdem ich ihn gefragt habe, was denn an dem System so schlecht wäre. Da hab ich mich drüber gefreut, das er nichts besseres zum meckern gefunden hat. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/941093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941093</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 13 Dec 2005 14:11:10 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 14:13:09 GMT]]></title><description><![CDATA[<p>Auch wenn in den beiden Basisklassen das nicht virtuell wäre gibt es ne Mehrdeutigkeit <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="🙂"
    /> Zum Thema Mehrfachvererbung verweise ich auch gerne auf &quot;Effektiv C++&quot; gibt's ein feines Kapitel zu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941094</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Tue, 13 Dec 2005 14:13:09 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 14:20:56 GMT]]></title><description><![CDATA[<p>Meld!</p>
<p>Basisinitialisierer (Aufruf des entprechenden Konstruktors) für virtuelle Basisklassen, die im Konstruktor einer darüberliegenden Klasse stehen, werden ignoriert.<br />
<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/941098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941098</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Tue, 13 Dec 2005 14:20:56 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 14:24:40 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9676">@Pellaeon</a><br />
Das Standard-Beispiel zum Virtuellen Ableiten verwendet an der Stelle Membervariablen und da gibt es werder Mehrdeutigkeit noch Fehlermeldungen anderer Art.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941103</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Tue, 13 Dec 2005 14:24:40 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 14:30:36 GMT]]></title><description><![CDATA[<p>ich meinte wenn Foo überhauptz nicht virtuell ist und in B sowie C deklariert wäre</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941111</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Tue, 13 Dec 2005 14:30:36 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 15:16:17 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9676">@Pellaeon</a><br />
Wäre ansonsten auch merkwürdig. <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>
<p>Ansonsten hab ich nochmal etwas nach gelesen. Mein Beispiel ist durchaus zutreffend, wenn auch mit ungünstigen Bezeichnern und kein Laufzeitproblem.<br />
Das Problem der Mehrfachvererbung ist hauptsächlich ein konzeptioneles (z.B. Fahrzeug mit der Funktion MaxGeschwindigkeit und davon abgeleitet Schiff und Automobil und von diesen beiden Amphibienfahrzeug.<br />
Selbst durch das Meckern des Compilers lässt sich dieses Problem nicht nur das Überschreiben von MaxGeschwindigkeit in Amphibienfahrzeug lösen, da Amphibienfahrzeug zwei unterschiedliche Maximalgeschwindigkeiten (eine zu Land und eine im Wasser) besitzt.<br />
Klingt sehr theoretisch ist aber bei gewachsenen Systemen durchaus ein großes Problem, da man da nicht einfach mal die Klassenstruktur umstellen kann.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941160</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Tue, 13 Dec 2005 15:16:17 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 16:12:45 GMT]]></title><description><![CDATA[<p>Aber das Amphibienfahrzeug weiß doch, ob es auf dem Wasser ist <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>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Fahrzeug
{
public:
	virtual int geschwindigkeit() const = 0;
};

class Wasserfahrzeug : public Fahrzeug
{
public:
	virtual int geschwindigkeit() const { return 10; }
};

class Landfahrzeug : public Fahrzeug
{
public:
	virtual int geschwindigkeit() const { return 50; }
};

class Amphibienfahrzeug : public Wasserfahrzeug, public Landfahrzeug
{
	bool m_istAufDemWasser;
public:
	Amphibienfahrzeug(bool istAufDemWasser = false)
		: m_istAufDemWasser(istAufDemWasser) {}

	bool istAufDemWasser() const { return m_istAufDemWasser; }
	void istAufDemWasser(bool istAufDemWasser) { m_istAufDemWasser = istAufDemWasser; }

	virtual int geschwindigkeit() const
	{
		return istAufDemWasser() ? Wasserfahrzeug::geschwindigkeit() : Landfahrzeug::geschwindigkeit();
	}
};

int main ()
{
    Amphibienfahrzeug test;
    cout &lt;&lt; test.geschwindigkeit() &lt;&lt; endl;
    test.istAufDemWasser(true);
    cout &lt;&lt; test.geschwindigkeit() &lt;&lt; endl;
    cin.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/941192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941192</guid><dc:creator><![CDATA[schorsch code]]></dc:creator><pubDate>Tue, 13 Dec 2005 16:12:45 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Tue, 13 Dec 2005 17:19:21 GMT]]></title><description><![CDATA[<p>Es gibt aber noch Boost Interface. Die unterscheiden sich von abstrakt virtuellen Klassen: <a href="http://www.cdiggins.com/bil.html#abc" rel="nofollow">http://www.cdiggins.com/bil.html#abc</a></p>
<p>In Java gibt es keine explizite virtualisierung. In C++ ist aber virtual nichts, was man leichtfertig benutzen sollte!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941240</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Tue, 13 Dec 2005 17:19:21 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Wed, 14 Dec 2005 07:18:51 GMT]]></title><description><![CDATA[<p>@schorsch code<br />
Durchaus ein Lösungsansatz, nur hast du dir dadurch die Schnittstelle für Fahrzeuge ausgehebelt (Auslesen der technischen Daten des Amphibienfahrzeugs wird zum Sonderfall, weil du um den Hebel umlegen zu können casten musst).<br />
<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/941600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941600</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Wed, 14 Dec 2005 07:18:51 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Wed, 14 Dec 2005 09:52:50 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10111">@Mathias</a>: Super! Danke! Jetzt komme ich den Problemen so langsam auch auf die Schliche. Obwohl eine Methode aller parallelen Basisklassen aus einer gemeinsamen Basisklasse ist, sprich die selbe sein sollte, ist sie dennoch mehrdeutig:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Fahrzeug
{
public:
    virtual int geschwindigkeit() const = 0;
    void zeigeGeschwindigkeit() const // ist in allen Subklassen gleich!
    {
    	cout &lt;&lt; geschwindigkeit() &lt;&lt; endl;
    }
};

class Wasserfahrzeug : public Fahrzeug
{
public:
    virtual int geschwindigkeit() const { return 10; }
};

class Landfahrzeug : public Fahrzeug
{
public:
    virtual int geschwindigkeit() const { return 50; }
};

class Amphibienfahrzeug : public Wasserfahrzeug, public Landfahrzeug
{
    bool m_istAufDemWasser;
public:
    Amphibienfahrzeug(bool istAufDemWasser = false)
        : m_istAufDemWasser(istAufDemWasser) {}

    bool istAufDemWasser() const { return m_istAufDemWasser; }
    void istAufDemWasser(bool istAufDemWasser) { m_istAufDemWasser = istAufDemWasser; }

    virtual int geschwindigkeit() const
    {
    	if(istAufDemWasser())
			return Wasserfahrzeug::geschwindigkeit();
		return Landfahrzeug::geschwindigkeit();
    }
};

void zeigeGeschwindigkeit(const Fahrzeug &amp;f)
{
	f.zeigeGeschwindigkeit();
}

template&lt;typename T&gt;
void bitteZeigeGeschwindigkeit(const T &amp;fahrzeug)
{
	cout &lt;&lt; fahrzeug.geschwindigkeit() &lt;&lt; endl;
}

int main ()
{
    Amphibienfahrzeug test;
    //Fahrzeug *test2 = new Amphibienfahrzeug(); //geht nicht, weil Fahrzeug in Amphibienfahrzeug mehrdeutig ist
    //test.zeigeGeschwindigkeit(); //geht nicht wegen Mehrdeutigkeit
    //zeigeGeschwindigkeit(test); //geht nicht, weil Fahrzeug in Amphibienfahrzeug mehrdeutig ist
    bitteZeigeGeschwindigkeit(test);
    test.istAufDemWasser(true);
    //test.zeigeGeschwindigkeit(); //geht nicht wegen Mehrdeutigkeit
    bitteZeigeGeschwindigkeit(test);
    cin.get();
}
</code></pre>
<p>Wenn man virtual ableitet geht es aber. Scheut man sich vor dynamic_cast, um spezielle Methoden zu benutzen (hat nichts mit Mehrfachvererbung zu tun), kann man auch die Basisklasse erweitern und bei nicht unterstützten Features Ausnahmen werfen, was natürlich nicht immer Sinn macht. Bei den Fahrzeugen könnte das so aussehen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Fahrzeug
{
public:
	virtual ~Fahrzeug(){}

	virtual bool istAufDemWasser() const = 0;
    virtual void istAufDemWasser(bool istAufDemWasser) = 0;

    virtual int geschwindigkeit() const = 0;
    void zeigeGeschwindigkeit() const { cout &lt;&lt; geschwindigkeit() &lt;&lt; endl; }
};

class Wasserfahrzeug : virtual public Fahrzeug
{
public:
	virtual bool istAufDemWasser() const { return true; };
    virtual void istAufDemWasser(bool istAufDemWasser)
    {
    	if(!istAufDemWasser)
			throw &quot;Wasserfahrzeug ist auf Grund gelaufen!&quot;;
    };

    virtual int geschwindigkeit() const { return 10; }
};

class Landfahrzeug : virtual public Fahrzeug
{
public:
	virtual bool istAufDemWasser() const { return false; };
    virtual void istAufDemWasser(bool istAufDemWasser)
    {
    	if(istAufDemWasser)
			throw &quot;Landfahrzeug ist abgesoffen!&quot;;
    };

    virtual int geschwindigkeit() const { return 50; }
};

class Amphibienfahrzeug : public Wasserfahrzeug, public Landfahrzeug
{
    bool m_istAufDemWasser;
public:
    Amphibienfahrzeug(bool istAufDemWasser = false)
        : m_istAufDemWasser(istAufDemWasser) {}

    bool istAufDemWasser() const { return m_istAufDemWasser; }
    void istAufDemWasser(bool istAufDemWasser) { m_istAufDemWasser = istAufDemWasser; }

    virtual int geschwindigkeit() const
    {
    	if(istAufDemWasser())
			return Wasserfahrzeug::geschwindigkeit();
		return Landfahrzeug::geschwindigkeit();
    }
};

void zeigeGeschwindigkeit(const Fahrzeug &amp;f) { f.zeigeGeschwindigkeit(); }

int main ()
{
    Amphibienfahrzeug test;
    test.zeigeGeschwindigkeit();
    test.istAufDemWasser(true);
    zeigeGeschwindigkeit(test);

    Fahrzeug *test2 = new Amphibienfahrzeug();
    zeigeGeschwindigkeit(*test2);
    test2-&gt;istAufDemWasser(true);
    test2-&gt;zeigeGeschwindigkeit();
    delete test2;

    cin.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/941710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941710</guid><dc:creator><![CDATA[schorsch code]]></dc:creator><pubDate>Wed, 14 Dec 2005 09:52:50 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Wed, 14 Dec 2005 10:54:54 GMT]]></title><description><![CDATA[<p>Das virtuelle Ableiten ist an der Stelle nicht wirklich eine Hilfe. Implementiert man die maximale Geschwindigkeit als Variable (durchaus sinnvoll) wäre das virutelle Ableiten falsch (man hätte wieder nur eine maximale Geschwindigkeit im Attributsatz und nicht derer zwei).</p>
<p>Das mit dem Typecast und dem Erweitern der Basisklasse ist so eine Sache. Man sollte nie hingehen und Wissen (Variablen/Funktionen) die zu abgeleiteten Klassen gehören in die Basisklasse stecken. Ansonsten besitzen plötzlich andere abgeleitete Klassen Funktionen oder Variablen, die keinen Sinn ergeben.</p>
<p>Allgemeine Lösung:</p>
<pre><code class="language-cpp">class Fahrzeug
{
public:
    virtual int GetMaxGeschwindigkeit (EMedium eMedium = EMedium::eNix) const;
};
</code></pre>
<p>Nicht Mehrdeutig, kann immer einen Wert zurückliefern (gegebenenfalls 0 wenn es sich in dem Medium nicht bewegen kann) und auch auf Flugzeuge, Raumschiffe und UBoote anwendbar. <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>
<p>Typumwandlung um Sonderfälle zu behandeln, die die Schnittstelle der Basisklasse nicht abdeckt, sollte man soweit wie möglich vermeiden. (Würde bedeuten es überall und in alle Ewigkeit berücksichtigen zu müssen. Auf die Lebenszeit eines Programms gesehen fatal, weil sich dadurch immer mehr Sonderfälle ansammeln bis sie einem über den Kopf wachsen.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941766</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Wed, 14 Dec 2005 10:54:54 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Wed, 14 Dec 2005 11:20:25 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Nur mal noch eine kleine Zwischenfrage<br />
zu meinem ursprünglichen Thema:<br />
Warum wird eigentlich ein virtueller Destruktor<br />
der Basisklasse auch dann aufgerufen, wenn er<br />
doch in der abgeleiteten Klasse redefiniert wurde?<br />
Ich kann dort zwar problemlos einen leeren<br />
Standarddestruktor implementieren, aber das sollte<br />
einem ja auch einer sagen: ansonsten wird anscheinend<br />
gar kein Destruktor ausgeführt, auch nicht der der<br />
abgeleiteten Klasse!</p>
<p>Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941790</guid><dc:creator><![CDATA[LionAM]]></dc:creator><pubDate>Wed, 14 Dec 2005 11:20:25 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Wed, 14 Dec 2005 11:31:42 GMT]]></title><description><![CDATA[<p>Destruktor wird immer ausgeführt, bei Vererbung von unten nach oben in der Hierarchie.<br />
Virtual brauchst du, wenn du Polymorphie ausnutzt.<br />
Wenn du z.B. einen Zeiger vomn Typ der Basisklasse hast, dieses aber auf eine abgeleitete Klasse zeigt, wird NUR der Konstruktor der Basisklasse beim Zerstören aufgerufen, wenn du kein virtual vorm Destruktor hast</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941798</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Wed, 14 Dec 2005 11:31:42 GMT</pubDate></item><item><title><![CDATA[Reply to Interfaces wie in Java? on Wed, 14 Dec 2005 11:55:06 GMT]]></title><description><![CDATA[<p>OK, muss ich mir merken.<br />
(hat ein weilchen gedauert, bis ich das rausgefunden hatte,<br />
weil er im Debugmodus einfach nicht in in die delete-Operation<br />
(sprich den Destruktor) reinspringen wollte...)<br />
Danke,<br />
Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941824</guid><dc:creator><![CDATA[LionAM]]></dc:creator><pubDate>Wed, 14 Dec 2005 11:55:06 GMT</pubDate></item></channel></rss>