CXX_point3 dynamic_cast用法总结

版权声明:本文为CSDN博主「weixin_44212574」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44212574/article/details/89043854

【格式】:dynamic_cast < type-id > ( expression)
该运算符把expression转换成type-id类型的对象。Type-id可以是类的指针、类的引用或者void*。如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。

【作用】:将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理, 即会作出一定的判断
若对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针;
若对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。

【注意】:
1、dynamic_cast在将父类cast到子类时,父类必须要有虚函数,否则编译器会报错。
2、 dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

 1 #include <iostream>
 2 #include <assert.h>
 3  
 4 using namespace std;
 5  
 6 // 我是父类
 7 class Tfather
 8 {
 9 public:
10     virtual void f() { cout << "father's f()" << endl; }
11 };
12  
13 // 我是子类
14 class Tson : public Tfather
15 {
16 public:
17     void f() { cout << "son's f()" << endl; }
18  
19     int data; // 我是子类独有成员
20 };
21  
22 int main()
23 { 
24     Tfather father;
25     Tson son;
26     son.data = 123;
27  
28     Tfather *pf;
29     Tson *ps;
30     
31     /* 上行转换:没有问题,多态有效 */
32     ps = &son;
33     pf = dynamic_cast<Tfather *>(ps);
34     pf->f();
35  
36     /* 下行转换(pf实际指向子类对象):没有问题 */
37     pf = &son;
38     ps = dynamic_cast<Tson *>(pf);
39     ps->f();
40     cout << ps->data << endl;        // 访问子类独有成员有效
41  
42     /* 下行转换(pf实际指向父类对象):含有不安全操作,dynamic_cast发挥作用返回NULL */
43     pf = &father;
44     ps = dynamic_cast<Tson *>(pf);
45     assert(ps != NULL);                 // 违背断言,阻止以下不安全操作
46     ps->f();
47     cout << ps->data << endl;        // 不安全操作,对象实例根本没有data成员
48  
49     /* 下行转换(pf实际指向父类对象):含有不安全操作,static_cast无视 */
50     pf = &father;
51     ps = static_cast<Tson *>(pf);
52     assert(ps != NULL);
53     ps->f();
54     cout << ps->data << endl;        // 不安全操作,对象实例根本没有data成员
55  
56     system("pause");
57 }

 



posted @ 2022-08-10 00:00  ID是菜鸟  阅读(44)  评论(0编辑  收藏  举报