void foo(MyClass* myClass)
{
BaseClass* pBaseClass = dynamic_cast<BaseClass*>(myClass);
delete myClass; // <-------------- Does this affects on pBaseClass ?
}
一般来说dynamic_cast
实际上是如何运作的? (它是否像复制构造函数一样工作?)
答案 0 :(得分:7)
不, 不安全。 dynamic_cast
只是一种类型转换 - 原始指针和转换指针都指向同一个对象。
转换后的指针可能指向稍微不同的地址(如果涉及多个继承),但它仍指向(内)到同一对象 - 不会发生对象复制。
编辑:我的意思是“不安全”,意思是“在你delete myClass
之后,pBaseClass
是一个悬空指针。”不过,它仍然是合法代码。非常危险。
答案 1 :(得分:6)
(请注意,class
不是有效的变量名称,因为它是关键字。我将其称为c
。
在dynamic_casting之后删除指针是否安全?
是;但请注意,删除指向的对象后,两个指针都无效。之后你不能使用任何一个指针值。
一般来说,dynamic_cast的实际效果如何?
它将指针或对类类型的引用转换为指针或对不同类类型的引用,并通过运行时检查转换是否有效。在这种情况下,如果BaseClass
与对象的动态类型相同或者是基类,则转换将成功(给出有效指针)。否则它将失败(给出空指针)。
如果您将*c
强制转换为引用类型,则失败会导致异常(std::bad_cast
),因为不存在空引用。
它是否像复制构造函数一样工作?
没有。复制构造函数用于复制对象。这不是复制它,只是改变指向它的指针的类型。副本看起来像
BaseClass bc = *c;
请注意,bc
的类型为BaseClass
,而不是c
的类型(可以推测从BaseClass
派生的类);这被称为“切片”,因为对象的派生部分是“切掉”而不是复制。
答案 2 :(得分:0)