ホームページ >バックエンド開発 >C++ >元のポインタが基本クラス オブジェクトを指しているときに、派生ポインタへの `static_cast` が C の派生オブジェクト全体にアクセスしているように見えるのはなぜですか?

元のポインタが基本クラス オブジェクトを指しているときに、派生ポインタへの `static_cast` が C の派生オブジェクト全体にアクセスしているように見えるのはなぜですか?

DDD
DDDオリジナル
2024-11-26 15:20:10284ブラウズ

Why Does `static_cast` to a Derived Pointer Seem to Access the Entire Derived Object in C   When the Original Pointer Points to a Base Class Object?

C での静的キャストによるダウンキャスト

C では、ダウンキャストとは、基本クラスのポインターまたは参照から派生クラスのポインターまたは参照への変換を指します。ダウンキャストを実行する 1 つの方法は、static_cast<> を使用することです。 Operator.

次のコードを考えてみましょう:

class base {
    base();
    virtual void func();
};

class derived : public base {
    derived();
    void func();
    void func_d();
    int a;
};

int main() {
    base *b = new base();
    sizeof(*b); // Gives 4.
    derived *d = static_cast<derived*>(b);
    sizeof(*d); // Gives 8- means whole derived obj size..why?
    d->func_d();
}

この例では、基底クラスの基本と派生クラスの派生があります。 Base 型のオブジェクトを指す基本クラス ポインター b を作成します。 static_cast<> を使用して、 b を派生クラス ポインター d にキャストしようとします。

ここでの紛らわしい質問は、 b が基底を指しているにもかかわらず、なぜ派生クラス ポインター d が派生クラス オブジェクト全体にアクセスできるのかということです。

ただし、static_cast<> の使用を理解することが重要です。ポインターを属していない型にキャストすることは、C では 未定義の動作 とみなされます。

C 標準 ([expr.static.cast]) によれば、静的基本クラス ポインターから派生クラス ポインターへのキャストは、次の条件が満たされる場合にのみ許可されます:

  1. 有効な標準変換が存在します。 「D へのポインター」から「B へのポインター」へ (D は派生クラス、B は基底クラス)。
  2. B は D の仮想基底クラスまたは仮想基底の基底クラスではありません。
  3. 指す基本クラス オブジェクトが実際に派生クラス オブジェクトのサブオブジェクトである場合、結果として得られるポインターは、それを囲んでいる派生クラスを指す必要があります。 object.

これらの条件のいずれかが満たされない場合、キャストの結果は未定義です。

指定されたコードでは、 b は純粋な基本クラス オブジェクトを指しているため、参照する囲み派生クラス オブジェクトではありません。したがって、プログラムの動作は予測不能になるため、信頼すべきではありません。

以上が元のポインタが基本クラス オブジェクトを指しているときに、派生ポインタへの `static_cast` が C の派生オブジェクト全体にアクセスしているように見えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。