我正在尝试从接口转发到派生类,但是我的虚拟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;
}
为什么会这样?
答案 0 :(得分:4)
您正在使用行中的临时地址
IFOO* A = &FOO();
应该是
IFOO* A = new FOO();
我想如果从界面中删除dtor,代码就会起作用,因为在这种情况下它不会被调用,并且你进入了未定义行为的领域,其中任何事情都是可能的,甚至是错误的代码按预期工作。 / p>
另外,我建议您不要在所有大写字母中编写类名,因为这通常是宏的约定(除非您的类名是宏,但肯定是不可能的)。另外,不要使用宏(PURE
)来使函数成为纯虚函数,这会让95%可能需要阅读代码的人感到困惑。