这里主要说的是,不同类对象的强转关系。例如有一下两个类
class A
{
public:
int a;
int b;
A()
{
a = 1;
b = 2;
}
void printa()
{
cout<<a<<endl;
}
};
class B
{
public:
int a;
B()
{
a = 3;
}
void printa()
{
cout<<a<<endl;
}
};
那下面这段代码该如何输出
A a;
B *p = (B *)&a;
p->printa();
答案应该是输出 1.
原因是:1、对象在内存中占用的大小与成员变量大小+虚函数指针+虚基类指针*虚基类,后者在例子中没有;
2、成员函数对于类中成员的解释基本是基于偏移来解释的,也就是说在Class B中成员a在printa中会被解释为对象地址偏移为0的一个单元。而此时B类型的指针p对应的内存单元是A类型的对象实例a强转后的内存单元,按照上面的偏移取得该地址偏移内的第一个单元,也就是a对象的第一个成员变量a。而此成员变量已在a初始化是被初始化为1.因此输出为1