首页 >后端开发 >C++ >当将基指针向下转换为不同的基对象时,'static_cast”如何看似允许访问派生类的成员?

当将基指针向下转换为不同的基对象时,'static_cast”如何看似允许访问派生类的成员?

Linda Hamilton
Linda Hamilton原创
2024-11-30 10:35:11366浏览

How Can `static_cast` Seemingly Allow Access to a Derived Class's Members When Downcasting a Base Pointer to a Distinct Base Object?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn