読者です 読者をやめる 読者になる 読者になる

Accelerated C++第13章

C++ Accelerated C++

初歩的なハンドルクラスが出てきて面白くなってきた。

派生クラスのオブジェクトの生成

  • 派生クラスのメンバも基底クラスのメンバも同様に全オブジェクトの分のメモリを確保
  • 基底クラスのコンストラクタを実行し、オブジェクトの基底クラス部分を初期化する
  • コンストラクタの初期化子に従って派生クラスのメンバを初期化する
  • 派生クラスのコンストラクタの中身があればそれを実行する。

これは165ページのクラスの生成(http://d.hatena.ne.jp/dogatana/20081013/1223885721)に対し派生クラスの部分が追加された形。

仮想関数

  • virtualはクラス定義の中でのみ指定する
  • クラス定義外で関数定義を行う場合、定義にはつけない
  • この性質は継承されるので、派生クラスの宣言につける必要はない
  • 仮想関数を宣言した場合、実際に使用するかどうかに関わらず定義が必要

動的結合

  • 仮想関数が参照もしくはポインタを通して関数が呼ばれるときに行われる(実行時に決定)
  • オブジェクトを通して呼ばれるときは静的結合となる(コンパイル時に決定)

仮想デストラクタ

  • 派生クラスのオブジェクトが基底クラスのポインタを通して破棄される場合に必要
  • 中身は空でも問題なし(システムが自動で行う範囲であれば)
  • 仮想デストラクタは継承されるので派生クラスで定義する必要はない

staticなメンバ

  • オブジェクトでなくクラスに付随
  • static なメンバ関数は、static なデータメンバのみアクセスできる
  • static なデータメンバの実体はクラスに1つのみ存在
  • static なデータメンバの初期化は、クラス定義の外で、完全修飾で記述する

派生クラスとfriendクラス宣言

  • friend は継承されないが、基底クラスのfriend宣言は派生クラスでも有効
  • 派生クラスの仮想関数呼び出しは基底クラスの参照もしくはポインタを通して呼び出されるため