C++の虚関数(なぜ構造関数は虚関数として宣言できないのか、構造関数は虚関数として宣言できるのか)

1494 ワード

コンストラクション関数は虚関数として宣言できませんが、コンストラクション関数は虚関数として宣言できます.場合によっては、コンストラクション関数は虚関数として宣言する必要があります.コンストラクション関数とコンストラクション関数で虚関数を呼び出すことは推奨されません.
コンストラクション関数が虚関数として宣言できない理由は?
  • オブジェクトを構築するときは、オブジェクトの実際のタイプを知る必要があります.虚関数は、実行中に実際のタイプを決定します.オブジェクトを構築するとき、オブジェクトがまだ構築に成功していないため、コンパイラはオブジェクトの実際のタイプが、そのクラス自体なのか、派生クラスなのか、それとも他なのかを知ることができません.
  • 虚関数の実行は虚関数テーブルに依存し、虚関数テーブルは構造関数、すなわち虚表ポインタ(vptr)を初期化し、虚関数テーブルを正しく指すようにする.オブジェクトを構築する間、虚関数テーブル(vtable)は初期化されず、実行できません.

  • 構造関数を虚関数に設定した理由は?
    構造関数の役割は、オブジェクトが取り消される前にクラスのオブジェクトをメモリから取り外すことであり、通常、システムはベースクラスの構造関数のみを実行し、派生クラスの構造関数は実行しません.
    ベースクラスの構造関数を虚関数として宣言し、ベースクラスオブジェクトを取り消すと同時に派生クラスのオブジェクトを取り消すプロセスが動的に関連付けられて完了します.
    解析関数を虚関数に設定したのは,メモリ漏洩を防止するためである.継承アーキテクチャでは、ベースクラスのポインタまたは参照が派生クラスを指し、ベースクラスdeleteを使用する場合、構造関数が虚関数として宣言されていない場合は、ベースクラスオブジェクトのみが構造され、派生クラスオブジェクトは構造されません.
    解析関数を虚関数に設定することを推奨します.
    説明:
  • 虚関数を使用すると、システムに一定の空間オーバーヘッドが発生します.クラスに虚関数がある場合、コンパイルシステムはクラスの虚関数テーブルを構築し、ポインタ配列であり、各虚関数のエントリアドレスを格納します.システムは動的関連を行う時間にオーバーヘッドが少なく,多態性の効率を向上させた.
  • コンパイラによって生成された構造関数は、サブクラスでない限り、親クラスに構造関数がある場合を除き、ベースクラスから継承されます.
  • には虚関数のクラスがあり、一般的には虚構造関数を定義します.

  • じゅんかそうかんすう
    あるシナリオでは、ベースクラスの虚関数は派生クラスでの使用のために定義されていますが、ベースクラスでは何の意味もありません.このような関数は純虚関数と呼ばれ、空の関数の形式を書く必要はありません.以下の形式で宣言する必要があります.
    virtual         (    ) = 0;

    純虚関数には関数体がなく,「=0」は関数の名前が関数の機能を備えていないことを意味せず,呼び出すことはできず,派生クラスでこの関数を定義してから関数の機能を備えることができ,呼び出すことができる.