关于指针的显示转换问题.
如图 , 指向基类的之类指针~! 这里我做一个显示转换, 如果我用来 做 p->fun() 是安全的,
但是显示转换会带来太多的危险,这个危险是什么呢?
什么情况下才会发生呢?
这样会发生危险:
但是我们 平时用 dynamic_cast<>();的时候 是怎样用才不会发生错误呢??
还有如下问题:
[解决办法]
要看所要转换的指针是否真正的指向了基类
[解决办法]
上面的转换会失败,在不能确定转换会成功的场合,应该检查dynamic_cast的结果
比如
void dosomethingwith(Base * p)
{
Derived1 * t=dynamic_cast<Derived1*>(p);
if(t){
// fine, p points to a Derived1 or its derivative class object
// so we take some action accordingly
}
else if(dynamic_cast<Derived2*>(p))
{
// and take action accordingly
}
else if(dynamic_cast<Dervied3*>(p)
{
// take yet some other action
}else
// take default action
}
[解决办法]
dynamic_cast 利用了rtti机制,是一种运行时决定的机制。一般用于从指向基类的指针动态转换到继承树上某个子类,如果转换不能成功,其结果是nullptr.
[code]
class Base{};
class D1: public Base{};
class D2: public Base{};
class DD1: public D1{}
Base * p=new DD1;
dynamic_cast<D1*>(p); // will succeed;
dynamic_cast<D2*>(p); // will get nullptr
dynamic_cast<DD1*>(p); // will succeed.
[code]
[解决办法]
恩,是的,它是需要将真正指向了直接的自己的指针强制转换过来,这里有点绕口。
[解决办法]
dynamic_cast的结果要判断是否为NULL指针