如果在未定义的头文件中调用声明为virtual的事件,会发生什么

时间:2013-10-01 19:45:47

标签: c++

我是C ++的新手并试图了解this代码中的一行:

current->Loop(g_game.time_step);

- 其中current是指向State类型对象的指针。

在状态的header文件中,循环函数被声明为virtual:

virtual void Loop(double time_step) {}

但是在States.Cpp文件中没有定义头函数。

如果调用声明但未定义的函数会发生什么?代码来自一个有效的开源游戏。该行执行没有错误。

3 个答案:

答案 0 :(得分:5)

您的函数定义; {}是(空)函数体。

virtual只是意味着子类可以通过虚拟调度覆盖它,而不是必须。要强制他们这样做,你可以通过编写= 0;代替{}使其成为“纯粹的”虚拟函数:

virtual void Loop(double time_step) = 0;

(这也会使类“抽象”,这意味着它无法直接实例化。)

答案 1 :(得分:1)

在您的情况下,声明和定义虚拟函数。

只是为了说清楚 - 声明是一个没有正文的函数签名,而在你的情况下,函数有一个空体({}),因此被定义。

至于什么时候没有定义并且你调用它 - 你会在链接阶段遇到错误(如果使用动态链接,可能会动态发生)。

答案 2 :(得分:1)

    virtual void Loop(double time_step) {}

这一行没有声明一个函数,它正在定义它。函数的主体是{},而声明最后会有;

至于发生了什么,它将无法正确链接,但通过重新编译某些部分而不是其他部分,当程序加载共享库时,您可能会收到符号查找错误。