ToB企服应用市场:ToB评测及商务社交产业平台
标题:
static_cast与dynamic_cast到底是什么?
[打印本页]
作者:
石小疯
时间:
2024-5-18 04:21
标题:
static_cast与dynamic_cast到底是什么?
写这个随笔说一下C++的static_cast和dynamic_cast用在子类与父类的指针转换时的一些事宜。首先,【static_cast,dynamic_cast】【父类指针,子类指针】,两两一组,共有4种组合:用 static_cast 父类转子类、用 static_cast 子类转父类、利用 dynamic_cast 父类转子类、用 dynamic_cast 子类转父类。搞清楚了这4种情况,这篇文章的使命也就达成了。
先说结论,后面给出一个作者以为通俗易懂的明白:
1. static_cast : 父类转子类:可以转,不报错,不安全;
2.static_casrt : 子类转父类:可以转,不报错,安全;
3.dynamic_cast : 父类转子类 :
a)若父类中没有虚函数,不能转,编译报错;
b)若父类至少有一个虚函数则可以转,不报错;但:
b.1)若父类指针指向的确实是一个子类对象,则dynamic_cast返回该子类对象的地点;
b.2)若父类指针指向的是父类对象,则dynamic_cast返回空指针nullptr;
4.dynamic_cast:子类转父类:可以转,不报错,安全。
总体来看,
子类
指针
转
成
父类
指针
无论怎样都是安全、允许的
(上面的2、4),所以static_cast和dynamic_cast都可以安全利用。
再说上面的1、3。 其实,
static_cast
相当于我们步调员对编译器的一种答应:我们清楚地知道如许转存在的任何风险,并且我们可以大概接受如许的风险。所以,当我们用static_cast将父类指针转换成子类指针时,编译器不报错。而
dynamic_cast
是在
运行时
实行范例转换,用于将基类的指针
安全地
转换成派生类的指针,也就是说,dynamic_cast会进行动态范例查抄。dynamic_cast相当于给步调员提供了一种安全的机制,让步调员可以大概安全地利用父类指针的动态范例。
下面举一个利用dynamic_cast(以上3中的b)的例子。首先给出父类和子类的定义:
class B
{
public:
virtual ~B() {};
};
class D : public B
{
};<br><br>
复制代码
如有以上类的定义:
代码1:
[code]B* pb = new B;if( D* p3 = dynamic_cast(pb) ) { cout
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4