Explizit casten



  • Hallo,

    mal ne blöde Frage:
    Warum muss ich hier explizit (nach A) casten?

    class A {
      public void method(int i);
    
    }
    
    class B : public A {
      public void method(int i, int i2);
    
    }
    
    B* b = new B();
    b->method(1); // So macht er nen Compiler-Fehler
    

    ChefCaster



  • Weil Überladung nicht automatisch über Vererbungsbeziehungen hinweg passiert. Wenn du das willst, kannst du eine using-Deklaration benutzen.



  • hier kannst du nicht nach A casten

    class A {
      public:
       void method(int i);
    };
    
    class B : public A {
      void method(int i, int i2);
    };
    
    void main()
    {
      A* a = new B;
      dynamic_cast<B>(a)->method(1,2);
      a->method(1);
    }
    


  • Wenn du in einer abgeleiteten Klasse eine gleichnamige Methode einführst, dann verdeckt diese alle gleichnamigen Methoden aus den Basisklassen.
    Möchtest du, dass der Compiler diese ebenfalls in Betracht zieht, musst du wie oben erwähnt eine using-deklaration verwenden.

    class A {
      public: void method(int i);
    
    }
    
    class B : public A {
      public: void method(int i, int i2);
      using A::method;
    }
    


  • sorry, ich hatte da Blödsinn erzählt:
    Korrect:

    class A {
      public:
       virtual void method(int i);
    };
    
    class B : public A {
      virtual void method(int i, int i2);
    };
    
    void main()
    {
      A* a = new B;
      a->method(1,2);
      a->method(1);
    }
    


  • Das ist aber auch Bloedsinn. A hat keine Methode mit zwei Parametern.



  • class A
    {
       virtual void bar();
       virtual void foo();
    };
    class B : public A
    {
       virtual void bar();
       virtual void foo();
    };
    void foo()
    {
       A* a = new B;
       static_cast< B* >( a )->foo(); // avoid
       a->bar(); // prefer
       a->foo();
    }
    

    test.cpp:57: error: `foo' undeclared (first use this function)
    verstehe ich nicht

    [/cpp]


Anmelden zum Antworten