ホームページ > バックエンド開発 > C++ > プライベート継承がある場合でも、「is_base_of」トレイトは基本クラスの関係をどのように決定するのでしょうか?

プライベート継承がある場合でも、「is_base_of」トレイトは基本クラスの関係をどのように決定するのでしょうか?

Patricia Arquette
リリース: 2024-11-30 21:43:12
オリジナル
721 人が閲覧しました

How Does the `is_base_of` Trait Determine Base Class Relationships, Even with Private Inheritance?

Is_Base_Of トレイトの実装

is_base_of トレイトは、プライベートまたはクラスが存在する場合でも、あるクラスが別のクラスから派生しているかどうかを判断する手段を提供します。保護された遺産。その実装は、関数テンプレートとユーザー定義の変換シーケンスの賢明な使用に依存しています。

仕組み

is_base_of テンプレートは、2 つのテンプレート パラメーター B と D を受け取ります。潜在的な基本クラスと派生クラスをそれぞれ表します。 2 つの静的メンバー関数が定義されています:

  • check(D*, T): 派生クラスへのポインターとテンプレート パラメーター T を受け入れます。
  • check(B*, int) : 基本クラスへのポインターと整数を受け入れます。

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 サイトの他の関連記事を参照してください。

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