我是靠谱客的博主 怕黑保温杯,这篇文章主要介绍C++类型转换 dynamic_cast,现在分享给大家,希望可以做个参考。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream> class Father { public:     virtual void Print(){         printf("this is Fathern");     }     int m_age=10; }; class Son:public Father{ public:     virtual void Print () override{         printf("this is Sonn");     }     std::string m_name = "Son"; }; //总结来说  //dynamic_cast就是避免了new父类对象 但是却将父类指针强行转换为子类指针引发的越界安全问题(因为new的是父类 子类的属性等并没有被构造 如果这时候访问就会越界) //dynamic_cast会检测到这种不安全 并返回一个空值 int main() {     //第一种情况 new 父类     // 使用static_cast强转可能引发越界错误     //Father* f = new Father;     //Son* s = f; 不能通过编译 因为这样会不安全 父类指针类型不能赋值给子类指针     //Son* s = static_cast<Son*>(f); 强转之后可以编译通过     //std::cout << s->m_name << std::endl;  //运行时会出现越界错误 因为子类的成员没有被创建     //而使用dynamic_cast避免了越界错误 dynamic_cast仅适用于存在继承与多态的对象之间     //Father* f = new Father;     //这种转换是不安全的 dynamic_cast对这种不安全的行为 会返回一个空值     //Son* s = dynamic_cast<Son*>(f);     //std::cout << s << std::endl;   //000000000     //第二种情况 new 子类     Father* f = new Son;     f->Print(); //多态 打印的是子类的成员函数内容     //f->m_name 即使new的是子类对象 但是通过父类指针无法访问到子类的属性     //可以通过转换实现 这种时候两种转换都没什么区别     //Son* s = dynamic_cast<Son*>(f);     Son* s = static_cast<Son*>(f);     std::cout << s->m_name << std::endl; }

最后

以上就是怕黑保温杯最近收集整理的关于C++类型转换 dynamic_cast的全部内容,更多相关C++类型转换内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部