Warnung 4250
-
Mehrfachvererbung ist eine tolle Sache! Und wenn mir C++ dieses als Sprachfeature anbietet, wird das schon seinen Sinn haben.
net's Lösungsansatz halte ich für unglücklich, unschön, unpraktikabel... ach, eigentlich ist der Lösungsansatz ein Blender!
Bjarne Stroustrup hat das in seinem Buch sehr schön erklärt, wie man Mehrfachvererbung mit sogar gleichnamigen Methodennamen (!) lösen kann.
Mehrfachvererbung vermisse ich in Java wie Hölle. Regelmäßig bin ich am fluchen, warum ich keine zur Verfügung habe. Ganz einfach weil ich es sehr oft benötige... jedenfalls verhältnismäßig oft, dafür das man angeblich auch ohne auskommt.
-
toll:
template<class B> class interface1 :public B { } template<class B> class interface2 :public B { }; template<class interfacelist> struct interfacehelper { typedef typename interfacelist::Head<typename interfacehelper<typename interfacelist::Tail>::type> type; }; template<> struct interfacehelper<Loki::NullType> { typedef Loki::NullType type }; class ende :public typename interfacehelper<TYPELIST_2(interface1,interface2)>::type { }
Wenn dir das besser gefällt
-
Artchi schrieb:
Mehrfachvererbung vermisse ich in Java wie Hölle.
in java haste doch 'interfaces'. davon kannste mehrere in eine klasse reintun. c++ hat dafür mehrfachvererbung
-
Ja, und die Interfaces haben keine Implemetierung... ganz super! Das ist ja gerade der Witz! Javas Interface sind in meinen Augen nur ne Krücke.
Ich kann ja nicht mal zwei Interface in meine Klasse packen, wenn diese Methodennamen haben, die sich gleichen.
Javas Interfaces sind _fast_ nur Schablonen in meinen Augen, um mich daran zu erinnern, was ich bitte implementieren soll. Java kommt aber mit einem blauen Auge davon, das zur Laufzeit wenigstens noch die Typinfos vorhanden sind und ich casten muß.
In C++ kann ich das machen:
class cowboy { public: draw() { ... } }; class sprite { draw() { ... } }; class my_player : public cowboy : public sprite { };
In Java würde das im Chaos enden. Selbst wenn cowboy und sprite Interfaces wären, würde der Compiler meckern. Und selbst wenn die beidem Methnoden unterschiedliche Namen hätten, müsste ich die auch noch selber implementieren.
Gemerkt, das ich keinen einzigen positiven Punkt finden konnte? Wogegen C++ mir alle Freiheiten lässt?
-
ROFLMAO
-
Artchi schrieb:
In C++ kann ich das machen:
class cowboy { public: draw() { ... } }; class sprite { draw() { ... } }; class my_player : public cowboy : public sprite { };
aber dann nicht das:
my_player mp; mp.draw(); // error - welches draw() :confused:
sowas kriegt, glaub ich, python auf die reihe. c++ aber nicht
-
net schrieb:
aber dann nicht das:
my_player mp; mp.draw(); // error - welches draw() :confused:
Das wäre ja auch herzlich schwachsinnig, denn wovon hinge dann ab, welches draw aufgerufen wird?
Moritz
-
Eben, für C++ kein Problem:
class my_player : public cowboy : public sprite { public: void draw() { cowboy::draw(); sprite::draw(); };
-
audacia schrieb:
net schrieb:
aber dann nicht das:
my_player mp; mp.draw(); // error - welches draw() :confused:
Das wäre ja auch herzlich schwachsinnig, denn wovon hinge dann ab, welches draw aufgerufen wird?
ok, dann mit nur einem draw
class base { public: void draw() {} }; class cowboy : public base { }; class pferd : public base { }; class my_player : public cowboy, pferd { }; ... my_player mp; mp.draw(); // geht auch nicht :confused: :confused: ...
vor allem die fehlermeldung ist witzig
main.cpp:39: error: request for member `draw' is ambiguous
main.cpp:19: error: candidates are: void base::draw()
main.cpp:19: error: void base::draw()
-
net schrieb:
ok, dann mit nur einem draw
... my_player mp; mp.draw(); // geht auch nicht :confused: :confused: ...
Dazu gibts virtuelle Vererbung. Z.B. so:
[cpp]
class base
{
public:
void draw() {}};
class cowboy : virtual public base
{
};class pferd : virtual public base
{
};class my_player : public cowboy, pferd
{
};...
my_player mp;
mp.draw(); // und schon geht es
...
[/cpp]Moritz
-
audacia schrieb:
Dazu gibts virtuelle Vererbung.
das ist cool
-
net schrieb:
aber dann nicht das:
my_player mp; mp.draw(); // error - welches draw() :confused:
Es gibt aber ne Möglichkeit mit der man spezifizeiren kann, welches der beiden draws aufgerufen werden muss. Ich glaubd as ging auch irgendwie mit virtuel, aber ohne den Schritt über die zwischenklassen zu machen. Das ist auch im Standard festgelegt. Wo im übrigen auch stehen müsste, dass solange keine zyklischen Abhängigkeiten vorkommen bei der Mehrfachvererbung keine Probleme und schon gar kein undefiniertes Verhalten auftreten.
Alles ne Frage der sorgfalt.
-
@net:
lächerlich.nichts ist Cowboy UND Pferd
EineKlasse ---> ZwischenKlasseMitInterface1 ---> EndgültigeKlasseMitInterface2
ist auch lächerlich.
Wie soll ich von EineKlasse und von Interface1 erben ohne mehrfach vererbung zu betreiben.
Mehrfachvererbung mit Interfaces ist gängige Praxis. Und wenn ein Interface ne Methode implementiert dann sehe ich daran nichts verwerfliches. Wenn du gegen mehrfachvererbung wettern willst, dann mach es richtig. aber das kann ich dir alles wiederlegen, bis aus die mögliche komplexität (die man sich aber bei Javalike Interfaces auch einfangen kann).
-
Shade Of Mine schrieb:
nichts ist Cowboy UND Pferd
na und? dann denk dir für pferd eben 'squaw' und die unterklasse von beiden ist 'bastard'. an den namen soll's ja nicht scheitern.
Shade Of Mine schrieb:
EineKlasse ---> ZwischenKlasseMitInterface1 ---> EndgültigeKlasseMitInterface2
ist auch lächerlich.
Wie soll ich von EineKlasse und von Interface1 erben ohne mehrfach vererbung zu betreiben.hehe, immerhin bist du der einzige, der's gemerkt hat