c – 在dynamic_casting之后删除指针是否安全?

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派生的类);这被称为“切片”,因为对象的派生部分是“切掉”而不是复制.

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...