概述
#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++类型转换 dynamic_cast所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复