在 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]),静态仅当满足以下条件时才允许从基类指针强制转换为派生类指针:
如果不满足其中任何一个条件,则转换的结果是未定义的。
在给定的代码中,由于 b 指向纯基类对象,因此有没有要指向的封闭派生类对象。因此,程序的行为变得不可预测,不应依赖。
以上是为什么当原始指针指向基类对象时,派生指针的'static_cast”似乎访问了 C 中的整个派生对象?的详细内容。更多信息请关注PHP中文网其他相关文章!