Object seilcing 对象切割测试
阅读侯杰的《深入浅出MFC》里面提到的虚函数的一章,提到了对象切割:
即将一个子类强制转换成父类时,它会把该对象的子类部分切割掉
比如,考虑这样一条强制转换语句:
(CFahter) CChldObject.MemberFunc();
会将子类对象强制转换成父类对象——它会产生一个临时对象
,调用了拷贝构造函数
考虑到我写的如下测试代码:
头文件MyObject.h
如下:
//这份头文件定义了父类和子类,父类有一个成员函数func1,去调用虚函数vfunc
#pragma once
#include<iostream>
using namespace std;
class CFather
{
public:
CFather()
{
cout << "CFather constuctor!\n";
cout << this << endl;
}
//copy constructor
CFather(CFather& x)
{
cout << "CFahter copy constructor!\n";
cout << this << endl;
}
void func()
{
cout << "CFater func begin!\n";
vfunc1();
}
virtual void vfunc1()
{
cout << "CFather come!\n";
}
};
class CChild : public CFather
{
public:
CChild()
{
cout << "CChild constuctor!\n";
}
virtual void vfunc1()
{
cout << "Cchild come!\n";
}
};
main函数如下:
#include "MyObject.h"
using namespace std;
int main()
{
CChild child;
//这个是拷贝构造函数么?
((CFather)child).func();
system("pause");
return 0;
}
运行结果如下:
CFather constuctor!
010FF998
CChild constuctor!
CFahter copy constructor!
010FF8CC
CFater func begin!
CFather come!
由this指针不同,以及调用了拷贝构造函数,可以看出,确实产生出了一个临时变量。
再次温习一下《深入浅出MFC》所说的对象切割,会把子类的成员部分切割掉,因此,vptr中并没有子类的虚函数vfunc