static_cast 演算子を使用したダウンキャスト: 未定義の動作をわかりやすく説明する
次の懸念事項を考慮してください。
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(); }
このシナリオでは、static_castを使用してベースポインタを派生ポインタにキャストすると、完全な派生オブジェクトのサイズと機能へのアクセスが許可されているようです。ただし、これによって次のような疑問が生じます。ベース ポインタがもともと別個のベース オブジェクトを指していた場合、どのようにしてこれが可能になるのでしょうか?
未定義の動作を理解する
答えは、 static_cast の性質と動的オブジェクトに対するその影響。 static_cast を使用して、オブジェクトが実際には持たない型にダウンキャストすることは、未定義の動作 として分類されます。未定義の動作の結果は大きく異なる可能性があり、この場合、派生クラスのメンバー関数 func_d() への予期せぬアクセスが許可されることも含まれます。
ダウンキャストの規則
によるとC 標準 (セクション 5.2.9) では、static_cast を使用したダウンキャストは特定の規則に従います。ルール:
例:
d->func_d() の呼び出しが予期せず成功するのは、この未定義の動作の結果です。安全でないダウンキャストの後に派生クラスのメンバーにアクセスする機能に依存しないでください。
以上がベースポインタを別個のベースオブジェクトにダウンキャストするときに、「static_cast」はどのようにして派生クラスのメンバーへのアクセスを許可しているように見えるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。