首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
数据库
›
Oracle
›
C++动态与静态转换区别详解
返回列表
发新帖
C++动态与静态转换区别详解
[复制链接]
发表于 2025-10-23 04:23:13
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
媒介
在 C++ 中,
dynamic_cast
和
static_cast
是两种差别的范例转换使用符,重要区别体如今
范例查抄的机会
、
安全
性
和实用
场景
上。以下是它们的焦点区别:
一、 范例查抄的机会
dynamic_cast
:
运行时查抄
。它会验证转换的合法性(好比指针或引用是否指向目标范例的有用对象)。如果转换非法,对指针返回
nullptr
,对引用抛出
std::bad_cast
非常。
要求类必须有虚函数
(即多态范例),否则无法使用。
static_cast
:
编译时查抄
。它信托开辟者对范例
安全
的包管,不实验运行时查抄。如果转换非法(好比无关类之间的转换),大概导致未界说举动(UB)。
实用于编译时已知范例关系的场景。
二、
安全
性
dynamic_cast
:
更安全
,但须要运行时开销(RTTI)。
重要用于多态范例的向下转型(
downcast
)或交织转型(
crosscast
)。
static_cast
:
不安全
,但
性能
更高(无运行时开销)。
须要开辟者自行确保范例兼容性,否则大概导致错误。
三、实用场景
dynamic_cast 的范例用途
多态范例(有虚函数的类)的向下转型:
class Base { virtual void foo() {} };
class Derived : public Base {};
Base* ptr = new Derived;
Derived* derived_ptr = dynamic_cast<Derived*>(ptr); // 安全向下转型
复制
代码
处置处罚继承条理中的交织转换(如多重继承中的兄弟类转换)。
static_cast 的范例用途
根本范例的显式转换(如
double
→
int
):
double d = 3.14;
int i = static_cast<int>(d);
复制
代码
非多态范例的指针/引用转换(需确保范例兼容):
Derived* d = new Derived;
Base* b = static_cast<Base*>(d); // 向上转型(安全,无需 dynamic_cast)
复制
代码
显式反向转换(如
void
* →
int
*):
void* vptr = some_address;
int* iptr = static_cast<int*>(vptr);
复制代码
四、代码示例对比
向下转型(多态范例)
class Base { virtual void foo() {} }; // 必须有多态性(虚函数)
class Derived : public Base {};
Base* base_ptr = new Derived;
// 使用 dynamic_cast(安全,但需要虚函数)
Derived* derived_ptr1 = dynamic_cast<Derived*>(base_ptr); // 成功
// 使用 static_cast(不安全,但强制转换)
Derived* derived_ptr2 = static_cast<Derived*>(base_ptr); // 可能未定义行为(若实际类型不匹配)
复制代码
class Base { virtual void foo() {} };
class Derived : public Base {};
Base* ptr = new Derived;
Derived* derived_ptr = dynamic_cast<Derived*>(ptr); // 安全向下转型
复制代码
非多态范例转换
class A {};
class B : public A {};
A* a_ptr = new B;
B* b_ptr = static_cast<B*>(a_ptr); // 编译通过,但无运行时检查
// B* b_ptr = dynamic_cast<B*>(a_ptr); // 错误:A 不是多态类型(无虚函数)
复制代码
总结
特性dynamic_caststatic_cast范例查抄机会运行时编译时安全性高(失败返回 nullptr 或抛非常)低(依赖开辟者包管)
性能
有运行时开销(RTTI)无开销实用范例多态范例(需虚函数)恣意范例(包罗非多态)范例用途向下转型、交织转型根本范例转换、显式向上/向下转型
优先选择 static_cast
,除非须要处置处罚多态范例的不确定转换(此时用
dynamic_cast
)。
回复
使用道具
举报
返回列表
浏览过的版块
物联网
钜形不锈钢水箱
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表