读书人

关于指针的显示转换有关问题

发布时间: 2014-01-14 23:14:00 作者: rapoo

关于指针的显示转换问题.
关于指针的显示转换有关问题

如图 , 指向基类的之类指针~! 这里我做一个显示转换, 如果我用来 做 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]
[解决办法]
引用:
Quote: 引用:

要看所要转换的指针是否真正的指向了基类


如果只想了基类就会发生错误 是吗?
因为是 子类类型的指针,内存无法映射,所以只想的肯定是 空地址? 对吧?

恩,是的,它是需要将真正指向了直接的自己的指针强制转换过来,这里有点绕口。
[解决办法]
dynamic_cast的结果要判断是否为NULL指针

读书人网 >C++

热点推荐