用一个父类指针指向一个子类对象,再用一个子类指针=这个父类指针,安全吗?

menzi11 2013-10-30 03:15:54
比如:
class A { ......... }

class B :public A { public: int data; }

A* ptr=new B;
//....干了一些别的事........
B* ptr2=(B*)ptr;
ptr2->data=10;

这样做安全吗? 我保证ptr在"干了一些别的事"的那段代码中不会指向其他位置,那么这样做安全吗?
标准中有相关规定吗?

另外,麻烦就不要说"这样做没意义"了,我就想知道这样安不安全,标准中
有没有类似保证.有没有意义不在讨论范围内.谢谢!
...全文
98 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
menzi11 2013-10-30
  • 打赏
  • 举报
回复
引用 2 楼 ri_aje 的回复:
怎么又问了,这帖子(http://bbs.csdn.net/topics/390626395)不是你的吗。 我在那里 #13 的回答,就是标准相关的条款。 不过这次主楼的代码受这句规范。 c++11 5.2.9/11 ... If the prvalue of type “pointer to cv1 B” points to a B that is actually a subobject of an object of type D, the resulting pointer points to the enclosing object of type D. ... 所以答案是,根据标准要求,这是安全的。
是又问..这回不是情况变了吗哈.多谢!
rocktyt 2013-10-30
  • 打赏
  • 举报
回复
确实,我想太多了
ztenv 版主 2013-10-30
  • 打赏
  • 举报
回复
引用 3 楼 ri_aje 的回复:
[quote=引用 1 楼 rocktyt2 的回复:] (B*)ptr这个写法不安全,如果有涉及到多重继承可能会错误 用dynamic_cast<B*>(ptr)的写法
主楼的是单继承。 dynamic_cast 要求存在虚函数,不一定能用。[/quote] ++ 楼主代码中这样做是安全的,
ri_aje 2013-10-30
  • 打赏
  • 举报
回复
引用 1 楼 rocktyt2 的回复:
(B*)ptr这个写法不安全,如果有涉及到多重继承可能会错误 用dynamic_cast<B*>(ptr)的写法
主楼的是单继承。 dynamic_cast 要求存在虚函数,不一定能用。
ri_aje 2013-10-30
  • 打赏
  • 举报
回复
怎么又问了,这帖子(http://bbs.csdn.net/topics/390626395)不是你的吗。 我在那里 #13 的回答,就是标准相关的条款。 不过这次主楼的代码受这句规范。 c++11 5.2.9/11 ... If the prvalue of type “pointer to cv1 B” points to a B that is actually a subobject of an object of type D, the resulting pointer points to the enclosing object of type D. ... 所以答案是,根据标准要求,这是安全的。
rocktyt 2013-10-30
  • 打赏
  • 举报
回复
(B*)ptr这个写法不安全,如果有涉及到多重继承可能会错误 用dynamic_cast<B*>(ptr)的写法

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧