一个函数原形是Fun(ClassA *& ca),对*&这样的语法研究得不多,以为是对指针的取引用,但貌似按此来转化类型未能通过编译.求解释.

解决方案 »

  1.   

    一个函数原形是void Fun(ClassA *& ca),对*&这样的语法研究得不多,以为是对指针的取引用传参数,但貌似按此来转化类型未能通过编译.求解释. ClassB派生自ClassA,现在有一个ClassB * pb,我这么调用没通过编译:Fun((ClassA*)pb)
      

  2.   

    直接传pb
    如果需要转换,用dynamic_cast
      

  3.   

    class AT
    {
    public:
    int f1(){return 1;}
    int ax;
    };class BT:public AT
    {};int ft(AT *& at)
    {
    return at->ax;
    }void CMfc1Dlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here

    BT* po = new BT;
    po->ax = 6;
    int r = ft(po);
    CString str;
    str.Format("%d",r);
    AfxMessageBox(str);

    }这样是不行的,ft((AT*)po)也不行,非要ft((AT*&)po)才行.习惯了对传引用的参数直接赋值了,这里没通过编译表示不解
      

  4.   

    VC6,不知道是C++标准的问题,还是VC6编译器的问题.
      

  5.   

    指针的引用,传递指针的话,就不能对指针本身的值进行修改,可以改变指针指向的值,如果是引用的话,就可以改变指针本身的值。
    例如比较常见的问题
    void fun(int*& p)
    {
     p = new int[10];
     //...
     for(int i=0; i != 10; ++i)
     {
       p[i] = i + 1;
     }
    }// 调用
    int* p = NULL;
    fun(p);
    printf("%d", p[3]);
      

  6.   

    vc6就这么严格了呀?我刚才尝试下了下,VS2010,也有这个问题。还以为因为是VS2010比较严格的关系呢
      

  7.   

    你说的这个知识也很有用,不过貌似不是主题问题,你这里这个p可以直接传入函数,而主题问题是我这里为什么必须加上(AT*&)强转
      

  8.   

    因为c++是严格数据类型检查
    你如果直接传递一个指针进函数
    c++必须明确的知道这个指针所指向的数据类型
    这样才好调用该指针所对应的类对象的虚函数假设有这样一种情况
    CDerived  : public CBase;
    CDerived d;
    CBase *p = &d;
    函数声明void Fun(ClassA *& ca);
    调用:Fun(p);
    这时编译器就不知道你的p所指向的对象到底是CDerived还是CBase了
    因为基类指针可以指向派生类对象,也就产生了一对多的关系,指针出现了多义性
    这时你在函数调用的时候就要强制设定参数类型,来消除这个多义性