static_cast与dynamic_cast到底是什么?

打印 上一主题 下一主题

主题 895|帖子 895|积分 2685

写这个随笔说一下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)的例子。首先给出父类和子类的定义:
  1. class B
  2. {
  3. public:
  4.     virtual ~B() {};
  5. };
  6. class D : public B
  7. {
  8. };<br><br>
复制代码
如有以上类的定义:
代码1:
[code]B* pb = new B;if( D* p3 = dynamic_cast(pb) )   {    cout
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表