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]) によれば、静的基本クラス ポインターから派生クラス ポインターへのキャストは、次の条件が満たされる場合にのみ許可されます:
これらの条件のいずれかが満たされない場合、キャストの結果は未定義です。
指定されたコードでは、 b は純粋な基本クラス オブジェクトを指しているため、参照する囲み派生クラス オブジェクトではありません。したがって、プログラムの動作は予測不能になるため、信頼すべきではありません。
以上が元のポインタが基本クラス オブジェクトを指しているときに、派生ポインタへの `static_cast` が C の派生オブジェクト全体にアクセスしているように見えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。