首页 > 后端开发 > C++ > 什么时候在 C 未定义行为中使用'static_cast”进行向下转换?

什么时候在 C 未定义行为中使用'static_cast”进行向下转换?

Patricia Arquette
发布: 2024-11-27 14:16:10
原创
701 人浏览过

When is using `static_cast` for downcasting in C   undefined behavior?

在 C 中使用 Static_cast 进行向下转型

向下转型是面向对象编程中使用的一种技术,用于将基类指针或引用强制转换为派生类类指针或引用。在 C 中,这可以使用 static_cast 运算符来实现。

考虑以下代码示例:

class Base { public: Base() {} virtual void func(); };

class Derived : public Base { public: Derived() {} void func(); void func_d(); int a; };

int main() {
    Base *b = new Base();
    std::cout << sizeof(*b) << std::endl; // Prints 4

    Derived *d = static_cast<Derived *>(b);
    std::cout << sizeof(*d) << std::endl; // Prints 8
    d->func_d();
}
登录后复制

在此示例中,创建了一个 Base 类型的指针,并使用以下对象进行初始化:类型基地。 sizeof 运算符返回 4,表示 Base 对象的大小。

但是,当我们尝试使用 static_cast 将 b 转换为 Derived 类型的指针并将其分配给 d 时,*d 的大小变为 8,这是派生对象的大小。这种行为是出乎意料的,因为我们通常期望 *d 的大小与 *b 的大小相同。

这种行为的原因在于未定义行为 (UB) 的概念。使用 static_cast 将对象转换为它实际上不具有的类型会产生 UB。在本例中,b 指向 Base 对象,而不是 Derived 对象。 Static_cast 无法改变对象的底层类型,因此转换的结果是未定义的。

C 标准,在第 5.2.9 节([expr.static.cast])中,指定了向下转换的规则使用 static_cast:“如果‘指向 cv1 B 的指针’类型的纯右值指向实际上是 D 类型对象的子对象的 B,则结果指针指向类型的封闭对象D. 否则,强制转换的结果是未定义的。”

在这种情况下,b 指向的 Base 对象不是 Derived 对象的子对象,因此强制转换的结果是未定义的。 UB 的症状差异很大,并且不能保证派生成员函数(func_d)能够成功调用。

以上是什么时候在 C 未定义行为中使用'static_cast”进行向下转换?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板