这儿看不懂,深入浅出简体第二版P69
class cobject
{
public:
virtual void serialize() {cout<<"cobject::serialize()\n\n";}
};
class cdocumnet:public cobject
{
public:
int m_data1;
void func() {cout<<"cdocument::func()"<<endl;
serialize();
            }
virtual void serialize(){cout<<"cdocumnet::serialize()\n\n";}
};
class cmydoc:public cdocument
{
public:
int m_data2;
virtual void serialize() { cout<<"cmydoc::serialize()\n\n;}
};
主程序里:
cmydoc mydoc;((cdocument)mydoc).func();
然后老侯说会mydoc的内容会被切割,可能会出错
但万幸这儿引发了一个拷贝构造函数,使得mydoc的vtable和cdocument德相同但我怎么也看不出怎样引用拷贝构造函数的
难道进行类型转换的时候都生成一个临时对象

解决方案 »

  1.   

    //有些东西看了才会相信,所以你可以看看地址到底是怎么变的
    cmydoc mydoc;
    004011D8   lea         ecx,[ebp-0Ch]
    004011DB   call        @ILT+120(cmydoc::cmydoc) (0040107d)((cdocument)mydoc).func();
    004011E0   lea         eax,[ebp-0Ch]
    004011E3   push        eax
    004011E4   lea         ecx,[ebp-14h]
    //这儿引发了cdocument的构造函数,从而使两者的vtable相同
    004011E7   call        @ILT+195(cdocument::cdocument) (004010c8)
    004011EC   mov         ecx,eax
    004011EE   call        @ILT+115(cdocument::func) (00401078)