石小疯 发表于 2024-5-18 04:21:38

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:
B* pb = new B;if( D* p3 = dynamic_cast(pb) )   {    cout
页: [1]
查看完整版本: static_cast与dynamic_cast到底是什么?