这儿看不懂,深入浅出简体第二版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德相同但我怎么也看不出怎样引用拷贝构造函数的
难道进行类型转换的时候都生成一个临时对象
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德相同但我怎么也看不出怎样引用拷贝构造函数的
难道进行类型转换的时候都生成一个临时对象
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)