我正在做一个绘制几何图形的控件。我通过下面的形式组织数据:
    CShape:public CCmdTarget{}//自动化类, 从CCmdTarget继承,实现IShape接口
    CLine:public CShape       //自动化类,从CShape继承,实现ILine接口
    CRectangle:public CShape  //自动化类,从CShape继承,实现IRectangle接口
    ......                    //其他类似于CLine和CRectangle的类
    在控件中有分别返回IShape*类型和ILine*类型的指针的方法:
    LPDISPATCH CMyCtl::Func1(/*...params...*/)
    {
CShape* pshape;
pshape=new CShape();
        ...//some statements
        return pshape->GetIDispatch(true);
    }
    LPDISPATCH CMyCtl::Func2(/*...params...*/)    
    {
CLine* pline;
pline=new CLine();
        ...//some statements
return pline->GetIDispatch(true);
    }
    LPDISPATCH CMyCtl::Func2_ex(/*...params...*/)    
    {
CLine* pline;
CShape * pshape;
pline=new CLine();
pshape=(CShape*)pline
        ...//some statements
return pshape->GetIDispatch(true);
    }    
    容器程序在加入控件时wizard为IShape和ILine产生了包装类:
    class CShape : public COleDispatchDriver
    class CLine : public COleDispatchDriver
症状:
    在容器程序中使用返回值时有区别:
1) CShape someshape(ctrl.Func1());
    someshape.xxx();//此时调用方法成功。
2) CLine someline(ctrl.Func2());
    someline.yyy();//此时调用方法失败。
3) CShape someshape(Func2_ex());
    someshape.xxx()//此时调用方法失败。
    //容器程序报错信息为:“未知的界面”
问题及思考:
    我在控件中我需要使用继承来维护正常的逻辑关系,我这样使用继承正确吗?
    如果正确,我在容器中怎样才能获取正确的line和rectangle对象呢?
    否则,我应该怎样实现这种继承的逻辑呢?

解决方案 »

  1.   

    你对C++的继承实现没有完全理解:
    虚表:
    CShape
       IDispatch
       IShape
    CLine
       IShape::IDispatch
       IShape
       ILine::IDispatch
       ILine
    CRectangle也类似,这里类型转换 (CShape *)pline 将返回 IShape::IDispatch,因此需要(ILine *)pline取ILine::IDispatch,至于GetDispatch,它使虚表走上COM正轨。
      

  2.   

    请问,是不是说不应该通过GetDispatch来返回接口?那应该如何获得正确的接口呢?请指教!
      

  3.   

    你的CShape有两个IDispatch,GetDispatch怎么知道要返回哪一个?
      

  4.   

    谢谢 dansei(小谢) 大侠指点!
    请问,那怎么才能返回ILine::IDispatch呢?
    我是不是要这样使用包容:
    CLine
    {
    private: 
    CShape m_shape;
    }
    或使用聚合?
      

  5.   

    to neweb(永不言败) :
        1.难道把wizard帮我生成的IShape和ILine重命名为IIShape和IILine问题就解决了?
        2.接口是类,地球人都知道.
        3.CIILine是什么东东?mfc嵌套实现的com是在接口前面加X,而且被屏蔽了,用不了也不需要啊!按照你说的CLine实现IILine接口,怎么接口包含com对象的实例?我不太明白你在讲什么.