首页 >后端开发 >C++ >为什么当原始指针指向基类对象时,派生指针的'static_cast”似乎访问了 C 中的整个派生对象?

为什么当原始指针指向基类对象时,派生指针的'static_cast”似乎访问了 C 中的整个派生对象?

DDD
DDD原创
2024-11-26 15:20:10347浏览

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 中,向下转型是指将基类指针或引用转换为派生类指针或引用。执行向下转型的一种方式是通过使用 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();
}

在此示例中,我们有一个基类 base 和一个派生类衍生。我们创建一个基类指针 b 指向基类型的对象。使用 static_cast<>,我们尝试将 b 强制转换为派生类指针 d。

这里令人困惑的问题是,为什么派生类指针 d 可以访问整个派生类对象,尽管 b 指向基类

但是,了解使用 static_cast 是至关重要的。将指针强制转换为不属于的类型在 C 中被视为未定义行为

根据 C 标准 ([expr.static.cast]),静态仅当满足以下条件时才允许从基类指针强制转换为派生类指针:

  1. 存在从“指针到派生类指针”的有效标准转换D”到“指向 B 的指针”(其中 D 是派生类,B 是基类)。
  2. B 不是 D 的虚拟基类或 D 的虚拟基类的基类。
  3. 如果指向的基类对象实际上是派生类对象的子对象,则结果指针应指向封闭的派生类

如果不满足其中任何一个条件,则转换的结果是未定义的。

在给定的代码中,由于 b 指向纯基类对象,因此有没有要指向的封闭派生类对象。因此,程序的行为变得不可预测,不应依赖。

以上是为什么当原始指针指向基类对象时,派生指针的'static_cast”似乎访问了 C 中的整个派生对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

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