要用一个CObject衍生类的表,每个对象可能不同.方法(一个库)用到了 MFC的RTTI.
在用 CObList 的 AddTail(CObject*) 时出错,跟踪到汇编, 在push eax前指针加了 24(18H),这是为什么?插入的对象是我写的几个 从 CObject 衍生的类, 用了 IMPLEMENT_SERIAL 的,都没有问题.改成CPtrList可以用,但我要用到类别属性,怎么办?class CdqoObject : public CObject
{
....
};class CdqoClass1 : public CdqoObject
{
....
};class CdqoClass2 : public CdqoObject
{
....
};class CdqoClass3 : public CdqoObject
{
.....
protected:
    CObList m_Objects;
};CdqoClass3::AddObject(CdqoClass1* pObj1)
{
    m_Objects.AddTail((CObject*)pObj1);
}

解决方案 »

  1.   

    出错不是在加的时候,而是在取出来的时候.但错误的原因应该是加的时间修改了指针.我在VC6+SP6下,工程中指定了 WINVER=0x0400, _WIN32_WINNT=0x0400, _WIN32_IE=0x0500
    另外加了MS XML SDK 4.0,那个库就是要用这些,不会有关系吧.加SDK (2001年11月版)会出错的.
      

  2.   

    取的过程是库里写的,代码如下:_listBase* m_ptrList = m_ptrObj;
    for(POSITION pos = m_ptrList->GetHeadPosition(); pos != NULL; )
    {
        _dataType val = (_dataType)m_ptrList->GetNext(pos);
        ......
    } _listBase 是模板参数, 传入时是 CObList
    _dataType 是模板参数, 传入时是 CObject*跟踪时val的值 与 CObList::AddTail(CObject* pObj)的 pObj值一样.所以说是插入时的问题
      

  3.   

    Debug下的汇编:
    147:          m_listQtObjects.AddTail(pObj);
    00454FCF   cmp         dword ptr [ebp+8],0
    00454FD3   je          CdqoSubclip::InsertPicture+60h (00454fe0)
    00454FD5   mov         edx,dword ptr [ebp+8]   <----第一个函数参数,是 pObj
    00454FD8   add         edx,18h        <----- 加了18H ????
    00454FDB   mov         dword ptr [ebp-8],edx
    00454FDE   jmp         CdqoSubclip::InsertPicture+67h (00454fe7)
    00454FE0   mov         dword ptr [ebp-8],0
    00454FE7   mov         eax,dword ptr [ebp-8]
    00454FEA   push        eax           <----- 压栈
    00454FEB   mov         ecx,dword ptr [ebp-4]
    00454FEE   add         ecx,34h
    00454FF1   call        CObList::AddTail (0045cfee)
      

  4.   

    不会啊,push eax只是将元素赋给新结点的数据变量。楼主把取值的代码写一下看看
      

  5.   

    上面汇编代码中的 ebp+8 是 函数 CdqoSubclip::InsertPicture(CdqoPicture* pObj, POSITION pos)的第一个参数.CdqoPicture 相当于前面所说的 CdqoClass1 
    CdqoSubclip 相当于 CdqoClass3
      

  6.   

    void CdqoSubclip::InsertPicture(CdqoPicture* pObj, POSITION pos)
    {
        if (NULL == pObj)
    return;

        TRACE3("%s,%d,Insert picture pointer=%08x\n", THIS_FILE, __LINE__, pObj);    m_listQtObjects.AddTail((CObject*)pObj);
    }
    上面的汇编就是最后一句的
      

  7.   

    应该是m_listQtObjects的父类里面的AddTail修改了地址。可否把CdqoSubclip的addtail写一下,大家分析一下
      

  8.   

    看一楼: AddTail 是 CObList的方法,没改,直接用的class CdqoSubclip : .....
    {
    protected:
        CObList m_listQtObjects;
    }
      

  9.   

    多谢大家. 我已经试出来了, 在第一个类中是多继承的.
    class CdqoObject : public COtherParent, public CObject
    {
    }COtherParent是另一个非 MFC类,改成以下就好了
    class CdqoObject : public CObject, public COtherParent
    {
    }
      

  10.   

    我看了COtherParent 的代码, 是实现了在三个 接口,共六个函数,有两个实现不是 virtual的,另外自身又加了两个 virtual 函数,应该是最后有效的六个 virtual 的虚表占了24个字节.多继承时的虚函数列表指针是分开的,第一个父类的虚表后可能有一个指针到第二个父类的虚表?