[gelöst] Vererbungshierarchie und Verdeckung
-
Hallo zusammen,
ich habe folgenden Beispielcode:
#include <cstdio> class Useless{}; class IntInterface { public: virtual void Do(int& a) = 0; }; class UselessInterface { public: virtual void Do(Useless& a) = 0; }; class NoLeaf : public IntInterface { public: virtual void Do(int& test) { printf("int"); }; }; class Leaf : public NoLeaf, public UselessInterface { public: //virtual void Do(int& a) //{ // NoLeaf::Do(a); //} virtual void Do(Useless& a) { printf("Useless"); } }; int main( void ) { Leaf a; Useless c; int b = 0; a.Do(c); a.Do(b); // <-- hier krachts, mit einem error C2664 /* Begin adding your custom code here */ return 0; }Ich verstehe nicht, warum es bei a.Do(b) kracht, da er die Funktion doch durch die Ableitung von NoLeaf kennen müsste.
Kann mir jemand erklären warum das passiert?
Danke
Tobi
-
Du greifst aber nicht auf Leaf::NoLeaf.Do() zu sondern auf Leaf:: Do()
Und da wird ein Useless& erwartet.
So greifst Du auf die Vererbung zu, wenn ich Dein Problem richtig verstanden habe.#include <cstdio> class Useless { }; class IntInterface { public: virtual void DoNL(int& a) = 0; }; class UselessInterface { public: virtual void Do(Useless& a) = 0; }; class NoLeaf : public IntInterface { public: virtual void DoNL(int& test) { printf("int"); }; }; class Leaf : public NoLeaf, public UselessInterface { public: //virtual void Do(int& a) //{ // NoLeaf:o(a); //} virtual void Do(Useless& a) { printf("Useless"); } }; int main( void ) { Leaf a; Useless c; int b = 0; a.Do(c); a.DoNL(b); // <-- hier krachts, mit einem error C2664 /* Begin adding your custom code here */ return 0; }
-
Hi,
danke für die Antwort, aber bei dem Code ist es ja genau der Witz, dass ich gleiche Funktionsnamen aber verschiedene Signaturen habe.
Allerdings habe ich gerade im Meyers (3 Auflage) die Regel 33 gelesen. Das Problem ist eben die Namensverdeckung.
So wie ich die Regel verstanden haben verdeckt das Do in Leaf dass Do in NoLeaf. Es spielt dabei keine Rolle, dass die Signaturen der Funktion unterschiedlich sind.
Daher muss entweder ein Weiterleitungsfunktion (wie der auskommentierte Teil im Code) verwenden oder ein
... using NoLeaf::Do();Damit ist das Thema für mich gelöst.
Greets
Tobi