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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY