虚拟接口Dtor&&的dynamic_cast

时间:2011-01-19 22:15:46

标签: c++ rtti

我正在尝试从接口转发到派生类,但是我的虚拟dtor杀了它?

class IFOO
{
public:
 virtual ~IFOO(){};

 virtual size_t index() PURE;
};

class FOO : public IFOO
{
public:
 FOO() : size(5){};
 ~FOO(){};

 virtual size_t index(){ return index; };

 size_t index;

};


int main() {

 IFOO* A = &FOO();

 FOO* B = dynamic_cast< FOO* >( A );

 return 0;
}

为什么会这样?

1 个答案:

答案 0 :(得分:4)

您正在使用行中的临时地址

IFOO* A = &FOO();

应该是

IFOO* A = new FOO();

我想如果从界面中删除dtor,代码就会起作用,因为在这种情况下它不会被调用,并且你进入了未定义行为的领域,其中任何事情都是可能的,甚至是错误的代码按预期工作。 / p>

另外,我建议您不要在所有大写字母中编写类名,因为这通常是宏的约定(除非您的类名是宏,但肯定是不可能的)。另外,不要使用宏(PURE)来使函数成为纯虚函数,这会让95%可能需要阅读代码的人感到困惑。