void foo(MyClass* myClass) { BaseClass* pBaseClass = dynamic_cast<BaseClass*>(myClass); delete myClass; // <-------------- Does this affects on pBaseClass ? }
一般来说dynamic_cast实际上是如何工作的? (它是否像复制构造函数一样工作?)
解决方法
(注意,类不是有效的变量名,因为它是一个关键字.我将其称为c).
Is it safe to delete the pointer after dynamic_casting?
是;但请注意,删除指向的对象后,两个指针都无效.之后您不能使用任何指针值.
In general how dynamic_cast actually works?
它将指针或对类类型的引用转换为指针或对不同类类型的引用,并通过运行时检查转换是否有效.在这种情况下,如果BaseClass与对象的动态类型相同或者是基类,则转换将成功(给出有效指针).否则它将失败(给出空指针).
如果你将* c转换为引用类型,那么失败会导致异常(std :: bad_cast),因为没有空引用这样的东西.
does it work like a copy constructor?
不可以.复制构造函数用于复制对象.这不是复制它,只是改变指向它的指针的类型.副本看起来像
BaseClass bc = *c;
注意,bc的类型是BaseClass,而不是c的类型(可以推测从BaseClass派生的类);这被称为“切片”,因为对象的派生部分是“切掉”而不是复制.