2011-12-13 191 views
0

此代码是否合法?传递对象指针作为指向基类的指针

它崩溃了,我不确定是因为我的编程环境(它是嵌入式设备),还是因为我编写了不友好的代码。

int foo(NGKGame * game) { 
    game->init(); //Crashes here 
    return 0; 
} 

int main() { 
    NGKGame * game = new PlaneGame(); 
    game->init(); //This call is okay 
    foo(game); 

    return 0; 
} 

NGKGame是基类。 PlaneGame是从NGKGame派生的类。 init()是基类中的纯虚函数,但在PlaneGame中实现。

感谢,

编辑:

被调用两次初始化函数仅仅是作为示例。在我目前的实施中,它是空的。

+0

你能否在两种情况下检查'game'和'init'的地址?他们是一样的吗? – fogbit

回答

0

没有什么不对您的片段。

虽然你是打算拨打NGKGame::init两次,或者它只是你的示例代码的一部分?我的直觉是PlaneGame::init里面的东西在再次调用时出现故障,如果是这样的话。

+0

这只是示例代码的一部分。 – tangrs

1

此代码很好 - 假设您可以拨打init()两次。

init()是PV NGKGame不是问题。 PVs的全部重点是允许你以foo()的方式给他们打电话。

2

它可能会崩溃,因为您在同一个对象上调用init()两次。既然你没有向我们展示init()的源代码,我不能推测它为什么会崩溃,但它似乎应该只调用一次名为init的函数。

如果你想有一个更好的答案,请参阅http://sscce.org/

0

该代码看起来不错。它可能必须与一些编译器标志。前段时间我有一个类似的问题。一个围绕着指针的代码,在没有优化标志(使用gcc)的情况下可以正常工作,但是会打开-O3(优化)。我没有弄清楚如何摆脱这一点,所以我只是手动添加了各种优化标志,这些标志已经启用了-O3并且工作正常。