ホームページ > バックエンド開発 > C++ > C コードで「vtable」および「typeinfo」の未定義シンボル エラーが発生するのはなぜですか?

C コードで「vtable」および「typeinfo」の未定義シンボル エラーが発生するのはなぜですか?

Susan Sarandon
リリース: 2024-11-03 15:30:30
オリジナル
429 人が閲覧しました

Why Am I Getting

未定義のシンボル: "vtable" および "typeinfo"

提供されたコードでは、リンク エラーが発生し、次のメッセージが表示されます。

Undefined symbols:
  "vtable for Obstacle", referenced from:
      Obstacle::Obstacle()in Myworld.o
  "typeinfo for Obstacle", referenced from:
      typeinfo for RECTANGLEin RECTANGLE.o
      typeinfo for CIRCLEin CIRCLE.o
ログイン後にコピー

「vtable」と「typeinfo」について

  • vtable (仮想メソッド テーブル): コンパイラによって使用されるデータ構造。クラスの仮想メソッドへのポインタを格納します。これにより、派生クラスのオブジェクトが仮想メソッドの正しい実装を呼び出すことができます。
  • typeinfo (実行時型情報): オブジェクトのメモリに格納されている、オブジェクトの型を識別する情報。これにより、動的な型チェックとポリモーフィックな動作が可能になります。

エラーの解決

このエラーの根本原因は、抽象基本クラス Obstacle に非-純粋な仮想関数。クラスが純粋仮想関数 (virtual void Method() = 0;) を宣言すると、派生クラスが実装をオーバーライドする必要があることを意味します。

Obstacle で非純粋仮想関数を定義した場合、コンパイラーはは、その実装が基本クラスまたは派生クラスのいずれかで見つかることを期待します。ただし、これらの実装が提供されていない場合、コンパイラはそれらの関数に依存する内部構造 (vtable および typeinfo) を生成します。リンク時に、関数が欠落していると未定義シンボル エラーが発生します。

解決策

この問題を解決するには、抽象基本クラス Obstacle 内のすべての仮想メソッドが宣言されていることを確認してください。純粋な仮想関数として。これにより、派生クラスはこれらのメソッドをオーバーライドして実装するようになります。そうすることで、正しい仮想メソッドの実装が提供され、未定義のシンボル エラーが発生することなくリンク プロセスが成功するはずです。

以上がC コードで「vtable」および「typeinfo」の未定義シンボル エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート