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.


Anmelden zum Antworten