Is_Base_Of トレイトの実装
is_base_of トレイトは、プライベートまたはクラスが存在する場合でも、あるクラスが別のクラスから派生しているかどうかを判断する手段を提供します。保護された遺産。その実装は、関数テンプレートとユーザー定義の変換シーケンスの賢明な使用に依存しています。
仕組み
is_base_of テンプレートは、2 つのテンプレート パラメーター B と D を受け取ります。潜在的な基本クラスと派生クラスをそれぞれ表します。 2 つの静的メンバー関数が定義されています:
is_base_of の値静的メンバー次に、sizeof 比較を使用して初期化されます。これは基本的に、Host でチェックを呼び出した結果のサイズが一致するかどうかをチェックします。オブジェクトは、「はい」の結果のサイズ (つまり、配列サイズ 1) と同じです。
プライベートベースの継承
実装はプライベートを処理できます。これは、Host クラスが nullptr を返す no-op 演算子 B*() const を提供するためです。これにより、B が D のプライベートベースであっても、コンパイラは check(B*, int) 関数の B* を D* に置き換えることができます。
Const 演算子の重要性
const として宣言されている演算子 B*() は、コンパイラーが暗黙のオブジェクト引数 this を受け取る変換関数の候補を確実に選択するようにするため、重要です。非定数参照。この微妙な違いにより、is_base_of トレイトは、基本型への変換が許可されているかどうかをチェックすることで、パブリック継承とプライベート継承を区別できるようになります。
テンプレート チェック関数
非テンプレート関数 check(B*, int) の代わりにテンプレート関数 check(D*, T) を使用します。この関数はオーバーロード解決ルールに依存します。変換関数を検索するときに、2 つの関数が同等に実行可能な場合、関数の戻り値の型によってどちらが優れているかが決まります。戻り値の型が Yes のテンプレートを使用すると、コンパイラは、D* から B* へのユーザー定義の変換の存在に基づいて、正しいバージョンのチェックを選択できます。
以上がプライベート継承がある場合でも、「is_base_of」トレイトは基本クラスの関係をどのように決定するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。