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