C++中 dynamic_cast转换的是数据类型还是指向的数据类型?
father*p=newfather;dynamic_cast<son*>(p);这个结果究竟是什么?是son*p=newfather;还是father*p=newson...
father *p = new father ;
dynamic_cast<son *>(p);
这个结果究竟是什么?是
son *p = new father ;
还是
father *p = new son; 展开
dynamic_cast<son *>(p);
这个结果究竟是什么?是
son *p = new father ;
还是
father *p = new son; 展开
3个回答
展开全部
father *p = new father ;
dynamic_cast<son *>(p);
这个结果是NULL,这点楼上的解释的很清楚啊。
(画图水平有限了,略丑,莫怪,o(╯□╰)o)
你看一下上图,如果你用father *p = new father ;那么你只新建了S1的空间,但是son的存储空间是S3的大小,有S2大小的存储空间你根本就没有创建,就算你用了dynamic_cast<son *>(p);来转化指针,但是因为p原本的空间大小根本就没有S2这一半的存在,所以这里会转化失败,返回NULL。
但是你如果是father *p = new son ;这里你新建了S3大小的空间,也就是S1和S2都新建了,但是在因为这时候p是father类型指针,所以这时候p最多的范围是S1大小内存储的东西,虽然你不能使用S2的内容,但是它(S2)毕竟是真实存在的,所以可以用dynamic_cast<son *>(p);来转化成son的指针,这时候就可以指向S3内的全部了。
追问
但是书上代码似乎能转换成功啊,前辈,能留个QQ号码么,我把代码发给您,您帮我看看?百度私信会直接把代码吞掉
追答
用百度私信给你留个邮箱吧,我很少上QQ,有邮箱就行了。
展开全部
没结果。dynamic_cast不会改变里面东西的值。
另:这个表达式的值目测是0。new出来的是father怎么能转成son。
你的这个例子,如果满足以下条件则可以使用dymanic_cast
1、son是father的子类
2、你new出来的是son,赋值给了father指针,要把这个指针转回son
3、你的father类里面有虚函数,并且在son里面得到了重写
另:这个表达式的值目测是0。new出来的是father怎么能转成son。
你的这个例子,如果满足以下条件则可以使用dymanic_cast
1、son是father的子类
2、你new出来的是son,赋值给了father指针,要把这个指针转回son
3、你的father类里面有虚函数,并且在son里面得到了重写
更多追问追答
追问
1 son是father的子类_____这个满足
2 原代码是 son * ps =dynamic_cast(p);
3 原代码中father是有虚函数,的确在son里面得到了重写
虽然条件满足,但是这个公式为何要有以上条件,还有这个公式到底弄出来的是什么,我还是完全不懂
追答
father是父类,写作father*读作son的事情不是没有。所以仅凭一个father,实在是不知道它到底真实情况是哪个类(这就叫面向对象,和“面向类”不同了w因为一个类的指针指向的可能不是这个类的实例)
好了,你现在要从father转到son。写 son* ps = (son*) p; 确实是一时痛快,但是如果p不是son,你的程序可能就要死了。
所以C++多了几个转换,比如有 son* ps = reinterpret_cast(p); 还有 son* ps = dynamic_cast(p);
reinterpret_cast只在语法上下功夫,编译变成机器代码以后,根本就不管你去死,int*它也能给你转成son*。
但是dynamic_cast不同,它会检查这个对象是不是真的是son。是才能成功。
怎么检查?虚函数。虚函数是靠虚函数表实现的,不同类型对象的虚函数表不同,这个是对象创建的时候包含在对象里面的,所以你new出来什么它就是什么,不会因为你用father*指向它它就变成father。这样就可以根据这个表来确定转换能不能成功。
虚表存在的条件是要有虚函数。
虚函数被重写的时候,这个类就有了一个不同于父类的虚表
然后dynamic_cast就根据这个来转。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一个,是指它指向的数据类型,而不是本身的,本身的是不可以改变的。
追问
那也不对啊,father是基类,son是派生类,指针怎么能以大指小?
追答
father *p = new father ; dynamic_cast(p); 这本来就是个错误。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询