解决方案 »

  1.   

    个人认为加上显示转换是为了让程序员再次确认IDC_MYBUTTON是不是CButton类型,因为GetDlgItem返回的可能不是CButton*类型。
      

  2.   

    查看一下GetDlgItem函数的定义,返回值为CWnd*
    不强制转换怎么变成CButton指针?这个是C++语法问题
      

  3.   

    GetDlgItem 返回是CWnd类型指针,需要强制转换到CButton*,另外这里不能使用dynamic_cast.
      

  4.   

    别人强制转换是为了方便直接这样调用:(CButton*)( GetDlgItem (IDC_MYBUTTON))->GetIcon(); 不需要那一步赋值了
      

  5.   

     但是如果 GetDlgItem (IDC_MYBUTTON)返回的是CWnd类型的指针,那为什么可以像下面那样直接用GetIcon(),像下面这样
    GetDlgItem (IDC_MYBUTTON)->GetIcon(); 
    而不需要:
    (CButton*)( GetDlgItem (IDC_MYBUTTON))->GetIcon(); 
      

  6.   

    GetDlgItem()返回的CWnd* ,但是你定义的变量是CButton*,将基类指针转换为派生类指针时,必须进行强制转换
      

  7.   

    因为GetIcon()是CWnd类就有的方法,所以可以直接调用。
    但如果是GetCheck()就不行了,因为GetCheck是CButton类特有的方法
      

  8.   

    就与马和白马一样。GetDlgItem返回马(CWnd*),你必须指定这只马是白马(CButton*)。然后“是白色的”(CButton类下的函数)这个论调才正确。
      

  9.   

    但是为什么这里不需要强制类型转换以?(MSDN 例子,第2章,执行时期型别信息)
    class graphicImage ......
    class GIFimage : public graphicImage  ......
    class PICTimage : public graphicImage ......
    graphicImage *gImage = new GIFimage();
    graphicImage *pImage = new PICTimage();
      

  10.   

    pButton已经指向应该指向的对象了,而且pButton是CButton类型指针。
    既然pButton的信息量足够了,而且不会导致歧义,那么有什么理由不要多了对GetDlgItem的返回值强制转换这个步骤?
      

  11.   

    pButton已经指向应该指向的对象了,而且pButton是CButton类型指针。
    既然pButton的信息量足够了,而且不会导致歧义,那么有什么理由不要多了对GetDlgItem的返回值强制转换这个步骤?
    打错了。,是还要
      

  12.   

    一个是为了编译过,另一个,不强转有些函数调不出来,再另一个,就牵扯到面向对象的概念了。建议看《深入浅出MFC》
      

  13.   

    pButton已经指向应该指向的对象了,而且pButton是CButton类型指针。
    既然pButton的信息量足够了,而且不会导致歧义,那么有什么理由不要多了对GetDlgItem的返回值强制转换这个步骤?
    打错了。,是还要
    不是,这个是C++语法问题,GetDlgItem函数声明已经声明为返回值为CWnd*类型,即便是编译器知道返回的具体是什么类型的指针,但是C++语法上也不支持这种自动转换,因为C++是强类型语言,类型必须一致才能直接赋值。
    另外,子类指针赋值到父类指针上不需要显式转换,而父类指针赋值到子类指针上需要显式转换。
    这些和MFC没有关系,都是C++语法问题,建议先牢固掌握下C++语言知识