首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2014-01-14 
关于指针的显示转换问题.如图 ,指向基类的之类指针~!这里我做一个显示转换,如果我用来 做p-fun()是安全的

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

  如图 ,    指向基类的之类指针~!   这里我做一个显示转换,   如果我用来 做  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指针

热点排行