int wird bool!?!!?
-
class B { public: virtual void foo( int i ) { std::cout << "B int\n"; } virtual void foo( bool b ) { std::cout << "B bool\n"; } }; class C : public B { public: virtual void foo( bool b ) { std::cout << "C bool\n"; B::foo(b); } }; class D : public C { public: virtual void foo( int i ) { std::cout << "D int\n"; C::foo(i); } virtual void foo( bool b ) { std::cout << "D bool\n"; C::foo(b); } }; int main() { D* d = new D; d->foo(8); }warning C4800: 'int': Variable wird auf booleschen Wert ('True' oder 'False') gesetzt
Warum und was kann man da machen?
-
Warum
Weil du erst D::foo(int) aufrufst, und D::foo(int) ruft C::foo(bool) auf, weil es kein C::foo(int) gibt.
was kann man da machen?
Ein C::foo(int) hinzufuegen oder C::foo(bool) nicht aufrufen.
-
endline schrieb:
oder C::foo(bool) nicht aufrufen.
Wie kann ich sagen, dass er nicht konvertieren soll und nicht C::foo(bool) aufruft?
-
i2b schrieb:
Wie kann ich sagen, dass er nicht konvertieren soll und nicht C::foo(bool) aufruft?
DU hast die Funktion implementiert und rufst dort explizit foo() der Basisklasse (C) auf. Wenn das nicht geschehen soll, musst du einfach die Codezeile rausnehmen...
-
Abhilfe könnte hier eine using-Deklaration sein, d.h.
class C : public B { using B::foo; // <- !!! public: virtual void foo( bool b ) { std::cout << "C bool\n"; B::foo(b); } };Ausprobiert habe ich es selber nicht, aber so müssten alle Überladungen von foo, also auch die 'int'-Variante, in der Klasse C verfügbar gemacht werden.
P.S: @l'abra d'or, es soll ja implizit die Variante A::foo(int) aufgerufen werden.