一般来说,衍生类所占的存储空间一般都比基础类大。当用基础类强制转换派生类物件(对象)指標时就会产生对象切割(Object slicing)。
class CObject
{
public:
virtual void vfunc(){cout << "CObject:vfunc\n";}
};
class CObject1 : public CObject
{
public:
int m_data1;
void fun()
{ cout << "CObject1:fun \n";
vfunc();
}
virtual void vfunc(){
cout << "CObject1:vfunc \n";
}
};
class CObject2 : public CObject1
{
public:
int m_data2;
virtual void vfunc()
{
cout << "CObject2:vfunc \n";
}
};
void main()
{
CObject2 myobject;
CObject2 *mypobject = new CObject2;
//--------------test1----------
myobject.fun();
//--------------test2----------
((CObject1*)(&myobject))->fun();
//--------------test3----------
mypobject->fun();
//--------------test4----------
((CObject)myobject).fun();
}
程序运行结果如下:
((CObject)myobject).fun();
myobject已经是被切割了。编译器在此语句为传值的方式下把CObject1物件内的内容拷贝了一份,使myobject的vtable内容与CObject1物件的vtable内容一样。所以,程序中的test4调用的虚拟函式为CObject1物件的vtable中的对应的虚拟函式。