Wozu virtuelle Funktionen ??
-
Habe mal eine Verständnisfrage und zwar wozu sind virtuelle Funktionen gut ?
mein Compiler nimmt auch dieses an:
#include <iostream>
using namespace std;class Saeugetier
{
public:
Saeugetier(){};
~Saeugetier(){};
void GetLaut();
};void Saeugetier::GetLaut()
{
cout << "Ich bin ein Saeugetier !" << endl;
}class Hund : Saeugetier
{
public:
Hund(){};
~Hund(){};
void GetLaut();
};void Hund::GetLaut()
{
cout << "Ich bin ein Hund !" << endl;
}int main() {
Hund Rudi;
Rudi.GetLaut();
return 0;
}und zeigt bei Ausführung "ICh bin ein Hund !" an.
Hoffe mir kann das jemand erklären aus den Büchern kann ich das net so richtig entnehmen .. Danke schonmal
Gruß Mikes11
-
int main() { Saeugetier* Rudi = new Hund(); Rudi->GetLaut(); return 0; }Na, was kommt jetzt für eine Ausgabe?
Nützlich ist das, wenn du z.B. eine Funktion hast, die einen Zeiger auf irgendein Säugetier übergeben bekommt und die GetLaut()-Funktion aufruft. Ohne virtuelle Funktionen und/oder Zeiger müsstest du diese Funktion für jeden möglichen Parameter (Hund/Katze/Maus/...) überladen, was ätzend werden könnte 
-
Also ist das z.b. für sowas gut wenn ich z.b. den Benutzer Frage welches Tier er haben möchte....
dann kann ich vorher einen Zeiger Saeugetier * pTier; festlegen,danach die Benutzerangabe abfragen und je nachmdem dann so ein tier "kreieren lassen "
switch (welchesTier)
{
case 1: pTier = new Hund;
break;
case 2: ......
....
}und dann so das richtige ausgeben lassen:
pTier.GetLaut();
richtig ? (grob vereinfacht vom code her jetzt....)
-
Jap, richtig, das wäre ein Beispiel!
Eine andere Möglichkeit wäre, wenn du verschiedene Säugetiere in einem Array speichern möchtest. Z.B. so (auch vereinfach):
Saeugetier* meine_kleine_farm[4]; meine_kleine_farm[0] = new Schwein(); meine_kleine_farm[1] = new Hund(); meine_kleine_farm[2] = new Katze(); meine_kleine_farm[3] = new Pferd(); for ( int i=0; i<4; i++ ) meine_kleine_farm[i]->GibLaut();
-
meine_kleine_farm
Gute Nacht, John Boy!
-
das hilft auch bei der klassenhirarchie,
du kannst es so einrichten das die klassen zwar nur hirarchich deklariert werden,
also klasse 1 kennt klasse 2 kennt klasse 3 aber nicht umgekehrt ....
wenn du aber eine basisklasse mit ein paar methoden zum informationsaustausch z.B. schreibst und
die methoden vernünftig überschreibst kann klasse 3 methoden von klasse 1 aufrufen ohne ihren header explizit einbinden zu müssen (wenn das nicht mit forward declarations geschieht, gibs krach wegen kreuz referenzen)
Wenn klasse 3 einen pointer vom typ der basisklasse der klasse 1 hat passiert das nict, weil die basisklasse den header der klasse 3 nicht kennt .... hmmmm ich dacht man könnt es ohne tiere einfacher ausdrücken >_<
-
hui jetzt wirds wieder kompliziert g
Vielen Dank für eure schnellen und guten Antworten
