使用 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中文网其他相关文章!