这样的代码编译不会出错,运行也不会出错。
但是一下代码,编译也能通过。
却会出现如图的错误,这表明访问了不属于它的内存空间。
也就是说,在函数Fun(CBase* pBase)中的CDerive* pDerive = (CDerive*)pBase;语句是有问题的。
这个问题只有在运行时才能发现,而编译时是不会被发现的。
dynamic_cast就很好的解决了这个问题。
如果把CDerive* pDerive = (CDerive*)pBase;改成CDerive* pDerive = dynamic_cast<CDerive*>(pBase);
当参数传入的是基类,而不是派生类的时候,强制类型转换就会返回一个空指针,通过对指针是否为空,就可以判断强制类型转换是否成功。
从派生类指针到基类指针转换是不存在什么问题的,而从基类指针到派生类指针的转换是存在风险的。
dynamic_cast用来执行从基类到派生类的安全转换,被称为安全的向下转移。