经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
动态类型转换dynamic_cast
来源:cnblogs  作者:放不下的小女孩  时间:2021/5/24 10:58:39  对本文有异议

  

  C++Primer第十九章的动态类型转换部分讲的不是很清楚,于是自己查cpp的官方手册总结一下。

  1. dynamic_cast < new-type > ( expression )

  动态类型转换是可以安全的在继承体系将指针和引用进行向上、向下和横向的转换。其表达式的类型为运行时的动态类型。具体功能如下:

 

  一、和隐式转换,静态转换static_cast一样的功能

 

  1、增加const属性:在expression和new-type类型相同或new-type为void*时,转换结果为expression的指针或引用。并且可以在dynamic_cast前加上const限定符实现增加const属性。

  1. const dynamic_cast < new-type > ( expression )

  2、向上转换upcast:和static_cast和隐式转换一样,dynamic_cast可以将派生类转换为基类。

 

  二、dynamic_cast独有的功能

  如果expression是一个指向具有多态特性的基类Base的指针或引用(静态类型),new-type是一个指向派生类Derived对象的指针或引用,具体进行那种转换根据expression的动态类型判断

 

  1、向下转换downcast:expression的动态类型为指向派生类Derived的指针或引用,并且Derived仅包含一份继承自Base的对象,则转换结果为指向Derived对象的指针或引用。(相当于从expressionh的父类转换为子类

  2、横向转换sidecast:expression的动态类型为指向一个类的对象的指针或引用,该类公有继承自Base和Derivied(Derived不一定继承自Base)并且继承自Derived的子成员是明确的(必须是虚继承,不能有二义性)。则转换结果为指向Derived的指针或引用。(相当于expression动态类型对象的一个父类转换为另一个父类)

 

  三、转换失败时如果转换目标是指针类型则返回空指针,引用类型抛出一个bad_cast异常。

 

  这里直接使用官方例子

  1. 1 #include <iostream>
  2. 2
  3. 3 struct V {
  4. 4 virtual void f() {} // must be polymorphic to use runtime-checked dynamic_cast
  5. 5 };
  6. 6 struct A : virtual V {};
  7. 7 struct B : virtual V {
  8. 8 B(V* v, A* a) {
  9. 9 // casts during construction (see the call in the constructor of D below)
  10. 10 dynamic_cast<B*>(v); // well-defined: v of type V*, V base of B, results in B*
  11. 11 dynamic_cast<B*>(a); // undefined behavior: a has type A*, A not a base of B
  12. 12 }
  13. 13 };
  14. 14 struct D : A, B {
  15. 15 D() : B(static_cast<A*>(this), this) { }
  16. 16 };
  17. 17
  18. 18 struct Base {
  19. 19 virtual ~Base() {}
  20. 20 };
  21. 21
  22. 22 struct Derived: Base {
  23. 23 virtual void name() {}
  24. 24 };
  25. 25
  26. 26 int main()
  27. 27 {
  28. 28 D d; // the most derived object
  29. 29 A& a = d; // upcast, dynamic_cast may be used, but unnecessary
  30. 30 [[maybe_unused]]
  31. 31 D& new_d = dynamic_cast<D&>(a); // downcast
  32. 32 [[maybe_unused]]
  33. 33 B& new_b = dynamic_cast<B&>(a); // sidecast
  34. 34
  35. 35
  36. 36 Base* b1 = new Base;
  37. 37 if(Derived* d = dynamic_cast<Derived*>(b1))
  38. 38 {
  39. 39 std::cout << "downcast from b1 to d successful\n";
  40. 40 d->name(); // safe to call
  41. 41 }
  42. 42
  43. 43 Base* b2 = new Derived;
  44. 44 if(Derived* d = dynamic_cast<Derived*>(b2))
  45. 45 {
  46. 46 std::cout << "downcast from b2 to d successful\n";
  47. 47 d->name(); // safe to call
  48. 48 }
  49. 49
  50. 50 delete b1;
  51. 51 delete b2;
  52. 52 }

  输出结果

  1. downcast from b2 to d successful

 

参考文献:dynamic_cast conversion - cppreference.com

原文链接:http://www.cnblogs.com/wildricky/p/14781325.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号