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

あなたの場合、仮想関数は宣言および定義されています。

明確にするために-宣言は本体を持たない関数シグネチャですが、あなたの場合、関数には空の本体( {})があるため、定義されています。

定義されていないときに呼び出すとどうなるかについては、リンク段階でエラーが発生します(動的リンクが使用されている場合、動的に発生する可能性があります)。

于 2013-10-01T19:49:21.660 に答える
1
    virtual void Loop(double time_step) {}

この行は関数を宣言しているのではなく、定義しています。関数の本体は、代わりに{}宣言の最後にある一方です。;

何が起こるかについては、適切にリンクできませんが、特定の部分を再コンパイルし、他の部分を再コンパイルしないと、プログラムが代わりに共有ライブラリをロードするときにシンボル検索エラーが発生する可能性があります。

于 2013-10-01T19:50:45.273 に答える