継承中のクラス役割ドメイン(再整理が必要)

1298 ワード

  • 各クラスは、クラスのメンバーを定義する独自の役割ドメインを定義します.継承関係がある場合、派生クラスの役割ドメインは、そのベースクラスの役割ドメインにネストされます.ネストされた役割ドメインがあるため、派生クラスは自分のメンバーのようにベースクラスメンバーを使用することができます.
  • オブジェクト、参照、またはポインタの静的タイプは、オブジェクトのどのメンバーが表示されるかを決定します.動的タイプが静的タイプと一致しない場合(ベースクラスポインタや参照が派生クラスを指すなど).

  • 名前の競合と継承
  • 他の役割ドメインと同様に、派生クラスも直接ベースクラスまたは間接ベースクラスに定義された名前を再定義できます.このとき、内層役割ドメインに定義された名前は、外層役割ドメインに定義された名前を隠すことになります.
  • は、非表示のベースクラスメンバーを役割ドメイン演算子によって使用することができる.Base::mem;のように(役割ドメイン演算子は既存の検索ルールを上書きし、コンパイラがBaseクラスの役割ドメインからmemを検索することを示す).
  • 継承された虚関数を上書きする以外に、派生クラスはベースクラスに定義された他の名前を再利用しないほうがいい.

  • 関数呼び出しの解析プロセス
    p->men()が呼び出されたと仮定すると、次の4つのステップが順次実行されます.
  • は、まずpの静的タイプを決定する.
  • pの静的タイプに対応するクラスでmemを検索する.見つからない場合は、継承チェーンの先頭に達するまで、直接ベースクラスで順次検索します.まだ見つからない場合は、コンパイラがエラーを報告します.
  • memが見つかったら、通常のタイプチェックを行い、現在見つかったmemに対して、今回の呼び出しが合法かどうかを決定します.
  • が正当であると仮定すると、コンパイラはmemが虚関数であるかどうかに応じて異なるコードを生成します.
  • memが虚関数であり、参照またはポインタによって呼び出された場合、コンパイラによって生成されたコードは、オブジェクトの動的タイプに基づいて、実行時に虚関数のどのバージョンを実行するかを決定します.
  • memが虚関数ではない場合、または参照またはポインタではなくオブジェクトによって呼び出される場合、コンパイラは通常の関数呼び出しを生成します.


  • ベースクラスと派生クラスの虚関数は、同じパラメータリストを持つ必要があります.
    両方の虚関数が受け入れる実パラメータが異なる場合、派生クラスの虚関数はベースクラスの参照またはポインタで呼び出すことはできません.両者の虚関数パラメータリストが異なる場合、派生クラスの虚関数はベースクラスの虚関数を上書きできないためです.