vererbung
-
folgende situation:
#include <iostream> using namespace std; class foo_base { public: void f(int a, int b) { cout<<"foo_base::f(int, int)"<<endl; }; }; class foo_derive : virtual public foo_base { public: foo_derive f(foo_derive const &src, int b) { cout<<"foo_derive::f(foo_derive const &, int)"<<endl; return src; }; }; int main(int argc, char** argv) { foo_derive g; g.f(2,2); return 0; };folgender Fehler:
error C2664: 'foo_derive::f' : cannot convert parameter 1 from 'int' to 'const foo_derive &' Reason: cannot convert from 'int' to 'const foo_derive' No constructor could take the source type, or constructor overload resolution was ambiguousich versteh nicht wo der Fehler liegt, da ist doch nichts mehrdeutig oder überseh ich da was? also man kann das durch
class foo_derive : virtual public foo_base { using foo_base::f; //[...] };umgehen, aber ich hätte trotzdem gern gewusst warum genau das nicht funktioniert, denn die Methoden sind meiner Ansicht nach eindeutig zuzuordnen.
vllt kann mir ja jemand helfen, vielen dank schonmal im voraus.
-
Die Definition von f der abgeleiteten Klasse überdeckt die Definition der Basisklasse. Unabhängig von den Parametern. Mit using blendest du sie wieder ein.
Btw, warum leitest du eigentlich virtual public ab? Auch wenn's für das Beispiel völlig egal ist.
-
virtual public ist so drin, weil ich das in meinen anderen strukturen auch so hab, das ist ja nicht weiter relevant.
-
FreakyBKA schrieb:
virtual public ist so drin, weil ich das in meinen anderen strukturen auch so hab, das ist ja nicht weiter relevant.
Naja virtuelle Vererbung kennzeichnet Klassen, die für "Diamandvererbung" infrage kommen UND damit Probleme hätten. Da sie etwas anders initialisiert werden als nicht-virtuelle (Konstruktor wird immer direkt von der am entferntesten abgeleitetn Klasse aufgerufen - und die muss das auch dürfen und können), würde ich das nicht zum Default machen.
Gruß,
Simon2.