我是C ++的新手并试图了解this代码中的一行:
current->Loop(g_game.time_step);
- 其中current是指向State类型对象的指针。
在状态的header文件中,循环函数被声明为virtual:
virtual void Loop(double time_step) {}
但是在States.Cpp文件中没有定义头函数。
如果调用声明但未定义的函数会发生什么?代码来自一个有效的开源游戏。该行执行没有错误。
答案 0 :(得分:5)
您的函数已定义; {}
是(空)函数体。
virtual
只是意味着子类可以通过虚拟调度覆盖它,而不是必须。要强制他们这样做,你可以通过编写= 0;
代替{}
使其成为“纯粹的”虚拟函数:
virtual void Loop(double time_step) = 0;
(这也会使类“抽象”,这意味着它无法直接实例化。)
答案 1 :(得分:1)
在您的情况下,声明和定义虚拟函数。
只是为了说清楚 - 声明是一个没有正文的函数签名,而在你的情况下,函数有一个空体({}
),因此被定义。
至于什么时候没有定义并且你调用它 - 你会在链接阶段遇到错误(如果使用动态链接,可能会动态发生)。
答案 2 :(得分:1)
virtual void Loop(double time_step) {}
这一行没有声明一个函数,它正在定义它。函数的主体是{}
,而声明最后会有;
。
至于发生了什么,它将无法正确链接,但通过重新编译某些部分而不是其他部分,当程序加载共享库时,您可能会收到符号查找错误。