请教:dynamic_cast和static_cast的区别的一个例子

visame 2007-10-08 01:16:45
Bjarne Stroustrup写的哦。
dynamic_cast和static_cast的区别的一个例子,但是文中"if pb points to a B (only)"是什么意思?
class B { /* ... */ };
class D : public B { /* ... */ };
void f(B* pb)
{
D* pd1 = dynamic_cast<D*>(pb);
D* pd2 = static_cast<D*>(pb);
}
If pb really points to a D then pd1 and pd2 get the same value. Similarly, if pb==0 both pd1 and pd2 become 0. However, if pb points to a B (only) then dynamic_cast will know enough to return 0 whereas static_cast must rely on the programmer’s assertion that pb points to a D and return a pointer
to the supposed D object.
...全文
121 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
visame 2007-10-08
  • 打赏
  • 举报
回复
jxlczjp77
谢谢!
Faitle 2007-10-08
  • 打赏
  • 举报
回复
意思是如果pb只是B对象,而不是B指针指向D对象
jxlczjp77 2007-10-08
  • 打赏
  • 举报
回复
visame :
问题是“如果pb指向一个D类型的对象”不可能。pb是B的指针,怎么可能指向D。
====================================

楼主原来是在这里卡住了,好好看看书,继承和虚函数是什么意思。
jxlczjp77 2007-10-08
  • 打赏
  • 举报
回复
差别在于dynamic_cast可以侦测类的继承关系,能根据实际情况确定是否允许转换。
而 static_cast 则非常暴力,它不管实际指针指向的是什么值,都实行强制转换。

比如楼主的例子:
class B { /* ... */ };
class D : public B { /* ... */ };
void f(B* pb)
{
D* pd1 = dynamic_cast <D* >(pb);
D* pd2 = static_cast <D* >(pb);
}

pb被声明为B*类型。
如果pb确实指向的是D类型对象,dynamic_cast<D*>可以确定这个转换是安全的,从而成功实现转换。
但如果pb实际指向的是B类型对象,很明显,将实际指向基类对象的指针转换为子类对象的指针是不安全的,dynamic_cast<D*>将返回0。

static_cast<D*> 则暴力的多,不管pb实际指向什么,都能成功转换。
B b;
D* pb1= static_cast<D*>(&b);

D* pb2= dynamic_cast<D*>(&b);
if(pb2)
pb2->...; //转换成功才进行成员访问

b对象并没有构造出子类的部分,如果这时pb1却访问了子类成员,程序很可能崩溃。
visame 2007-10-08
  • 打赏
  • 举报
回复
(ZZ)某人的解释:
在上面的代码段中,如果pb指向一个D类型的对象,pd1和pd2是一样的,并且对这两个指针
执行D类型的任何操作都是安全的;但是,如果pb指向的是一个B类型的对象,那么pd1将是
一个指向该对象的指针,对它进行D类型的操作将是不安全的(如访问m_szName),而pd2
将是一个空指针。

问题是“如果pb指向一个D类型的对象”不可能。pb是B的指针,怎么可能指向D。
visame 2007-10-08
  • 打赏
  • 举报
回复
MSDN上相同的例子:
// static_cast_Operator.cpp
// compile with: /LD
class B {};

class D : public B {};

void f(B* pb, D* pd) {
D* pd2 = static_cast<D*>(pb); // not safe, pb may
// point to just B

B* pb2 = static_cast<B*>(pd); // safe conversion
}
pb may point to just B是什么意思?pb是B的指针,不指向B指向什么?
visame 2007-10-08
  • 打赏
  • 举报
回复
lddLinan能不能用中文。。。
Maybe it means the object referenced by pointer pb is only of type of class B, not any derived classes
这个还是没有解释为什么static转换可能会出现错误。
lddLinan 2007-10-08
  • 打赏
  • 举报
回复
Maybe it means the object referenced by pointer pb is only of type of class B, not any derived classes.

64,439

社区成员

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

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