dynamic_cast возвращает std :: bad_cast, и я не знаю почему - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть базовый класс и производный класс, и у меня есть строка, которая выдает мне ошибку std :: bad_cast, если base является объектом базового класса. Почему это дает мне эту ошибку? И, пробуя, я видел, что static_cast работает, но я не знаю почему.

Строка:

#include <iostream>
  class Base
  {
   public:
     virtual void g(){std::cout<<"a";};
   };

  class Derived: public Base
 {
  public:
   void g(){std::cout<<"b";};
  };

  void fn(Base & base) 
  { 

    Derived & pb = dynamic_cast<Derived &>(base); 

     pb.g(); 

   } 

  int main() 
   { 
     Base f1;
    fn(f1);
   } 

1 Ответ

0 голосов
/ 10 ноября 2018

Вы пытаетесь привести Base&, который на самом деле Base& (а не Derived&) к Derived&, поэтому, конечно, он потерпит неудачу. Помните, что все Derived объекты также являются Base объектами, но не все Base объекты являются Derived объектами.

Что вы, вероятно, хотите сделать, это передать фактический Derived объект в функцию

int main()
{
    Derived f1;
    fn(f1);
}

Позвольте мне объяснить более конкретным примером.

struct Rectangle
{
    Rectangle(int width, int height):
        width(width), height(height) {}
    virtual ~Rectangle() {}
    int width, height;
};
struct Square: Rectangle
{
    Square(int size): Rectangle(size, size) {}
};

int main()
{
    Square square(3);
    Rectangle rect(1, 2);

    Rectangle& ref_to_square = square;
    Rectangle& ref_to_rect   = rect;

    // This is okay
    // ref_to_square is a reference to an actual square
    dynamic_cast<Square&>(ref_to_square);

    // This will fail
    // ref_to_rect is *not* a reference to an actual square
    dynamic_cast<Square&>(ref_to_rect);
}
...