1

我是 C++ 新手,并试图从这段代码中理解一行:

current->Loop(g_game.time_step);

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

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

virtual void Loop(double time_step) {}

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

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

4

3 回答 3

5

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

virtual只是意味着子类可以用虚拟调度覆盖它,而不是它们必须。为了迫使他们这样做,你可以通过编写= 0;而不是{}

virtual void Loop(double time_step) = 0;

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

于 2013-10-01T19:48:54.417 回答
1
    virtual void Loop(double time_step) {}

这一行不是声明一个函数,而是定义它。函数的主体是{}while 声明将;在末尾有。

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

于 2013-10-01T19:50:45.273 回答
1

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

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

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

于 2013-10-01T19:49:21.660 回答