Вы пытаетесь привести 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);
}