void foo(MyClass* myClass)
{
BaseClass* pBaseClass = dynamic_cast<BaseClass*>(myClass);
delete myClass; // <-------------- Does this affects on pBaseClass ?
}一般来说,dynamic_cast实际上是如何工作的?(它的工作方式是否像复制构造函数?)
发布于 2013-11-20 15:52:57
(注意,class不是一个有效的变量名,因为它是一个关键字。我把它叫做c )。
在dynamic_casting之后删除指针安全吗?
是的;但请注意,在删除指向的对象之后,两个指针都是无效的。之后不能使用这两个指针值。
一般来说,dynamic_cast实际上是如何工作的?
它通过运行时检查转换是否有效,将指向类类型的指针或引用转换为指针或引用。在这种情况下,如果BaseClass与对象的动态类型相同或属于该对象的基类,则转换将成功(提供一个有效指针)。否则它将失败(提供一个空指针)。
如果将*c转换为引用类型,则失败将导致异常(std::bad_cast),因为不存在空引用。
它像复制构造函数一样工作吗?
不是的。复制构造函数用于复制对象。这不是复制它,只是改变指向它的指针的类型。一份副本看起来就像
BaseClass bc = *c;请注意,bc的类型是BaseClass,而不是c的类型(可以推定为从BaseClass派生的类);这称为“切片”,因为对象的派生部分是“切片”而不是复制的。
发布于 2013-11-20 15:46:22
不,,那是而不是安全。dynamic_cast只是一种类型转换--原始指针和转换指针都指向同一个对象。
转换后的指针可能指向一个稍微不同的地址(如果涉及多个继承),但它仍然指向同一个对象--没有发生对象复制。
编辑:,我的意思是“不安全”,意思是“在你delete myClass之后,pBaseClass是一个悬空的指针。”不过,这仍然是法律法规。只是相当危险。
发布于 2013-11-20 16:20:16
https://stackoverflow.com/questions/20100360
复制相似问题