有基类CValue,继承类CIntegerValue,和CFloatValue,
encodeValue(CValue val)
 {
   CString cs;
   int type;   //val=(CValue)val;
传进来的val,有时是CIntegerValue类型,有时是CFloatValue类型,
   type=val.type;
   if(type==INTEGER)
   {
    CIntegerValue intVal;
怎样将val转换为intVal呢?????????????
   }

解决方案 »

  1.   

    encodeValue(CValue val)
    =>
    encodeValue(const CValue& val)
    并且CValue应该虚化,如果没有需要virtual的method,可以考虑virtual destructorCIntegerVal intVal=static_cast<CInterVal>(val);
      

  2.   

    用引用参数或指针就可以了,系统会知道哪个对象是什么
    encodeValue(CValue *pval)
    {
      type=val.type;
       if(type==INTEGER)
       {
        CIntegerValue *intVal = dynamic_cast<CIntegerValue *>pval;
       
       }
    }如果使用你原来的传值方法,进入函数后对象已经被down cast成CValue类型了,并且这个CValue是构建在堆栈上的临时对象,不能cast成CIntegerValue或CFloatValue
      

  3.   

    我这个encodeValue是动态链接库中的一个函数,这个函数由另一个exe文件调用,它的参数改为encodeValue(const CValue& val),或者encodeValue(CValue *pval),exe还能调用吗?
      

  4.   

    我采用上面的办法,不管是用static_cast,还是用dynamic_cast,都会出错,
    warning C4541: 'dynamic_cast' used on polymorphic type 'class CValue' with /GR-; unpredictable behavior may result
    这是使用dynamic_cast,不知道是什么意思?