static_cast 和 dynamic_cast

本文详细比较了C++中的static_cast和dynamic_cast,强调了static_cast速度快但需程序员确保安全性,而dynamic_cast提供更高安全但效率较低,尤其当涉及派生类和虚函数时。
摘要由CSDN通过智能技术生成

static_cast 和 dynamic_cast

1. 两者的对比

static_castdynamic_cast
速度更快速度较慢
静态类型转换,在编译期间完成动态类型转换,运行期间完成
派生类转父类 是安全的派生类转父类 是安全的
父类转派生类 没有动态类型检查是不安全的父类转派生类 如果转换失败会返回NULL
如果两个类没有继承关系,编译会报错误父类必须有虚函数,否则会报编译错误

注意: dynamic_cast 需要父类有虚函数的原因:运行时需要判断当前指针的类型,而这个信息存放在虚函数表中

2. 代码示例

class A
{
public:
	virtual ~A() {};  // 需要有虚函数,否则无法用 dynamic_cast
	int a = 1;
};

class B
{
public:
	int b = 2;
};

class C : public A, public B
{
public:
	int c = 3;
};

class D : public A
{
public:
	int d = 4;
};

void Test1()
{
	A* pA = new C;
	B* pB = static_cast<B*>(pA); // 编译失败:A 和 B 之间没有继承关系
	C* pC = static_cast<C*>(pA); // 成功
	D* pD = static_cast<D*>(pA); // 编译成功,运行也没有报错,但是不符合预期,这两者之间不应该能够转换成功
}

void Test2()
{
	A* pA = new C;
	B* pB = dynamic_cast<B*>(pA); // 成功: 运行时会检测到pA 是 C 类型的指针,能够转换成 B 类型
	C* pC = dynamic_cast<C*>(pA); // 成功
	D* pD = dynamic_cast<D*>(pA); // 失败:相对于 static_cast 更符合预期
}

3. 小结

  1. static_cast 有更快的转换速度,但是安全性需要程序员自己保证
  2. dynamic_cast 具有更好的安全性,但是转换效率较低
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值