dynamic_cast导致bad_cast错误

时间:2015-05-08 11:09:17

标签: c++ casting dynamic-cast

我想了解dynamic_cast的工作原理。我有一个类interfaceElement和一个从它派生的类菜单。在我的程序中,我没有创建类interfaceElement的对象。执行以下代码(使用dynamic_cast执行行更准确)时,抛出bad_cast异常

void drawInterfaceElement(interfaceElement elem, int colour1, int colour2)
{
    if (elem.getType()=="MENU")
    {
        menu &cur = dynamic_cast<menu&>(elem);
        this->drawMenu(&cur,colour1,colour2);
    }
}

为什么?

2 个答案:

答案 0 :(得分:2)

interfaceElement为参考。目前,您通过按值获取切片,导致menu子对象丢失。 dynamic_cast无法转换为该类型,导致std::bad_cast被抛出(如果您转换为指针,则会返回空指针)。

请参阅What is object slicing?

答案 1 :(得分:2)

问题是您按值传递elem。所以它是一个interfaceElement对象,不能归结为派生类型。

您需要通过引用传递:

void drawInterfaceElement(interfaceElement& elem, int colour1, int colour2)
                                          ^