【发布时间】:2020-12-08 10:27:15
【问题描述】:
我知道由于内存布局,多重继承和虚函数在将派生类指针转换为基类指针时会导致指针偏移。
但是我不明白为什么虚拟继承也会导致这种效果?我只知道虚拟继承是防止同一个类的多个实例。
下面是我的代码。
class X
{
public:
int i;
};
class Y :virtual public X
{
int j;
public:
void vf(){};
};
int main()
{
Y* py = new Y;
X* px = (X*)py;
cout<<py<<endl;
cout<<px<<endl;
}
【问题讨论】:
-
请不要添加不相关的标签。那显然不是 C 代码。
-
px的值与py的值不同
-
“也会导致这个问题吗?”:不是问题吧?
-
解释为什么你认为在这种情况下指针偏移是一个问题。建议
Y中(实际上)只有一个X是一回事,而建议X和Y应该在同一个地址是另一回事。想象一下如果Y有多个虚拟基址X1、X2等会发生什么 - 你真的建议Y的地址应该等于所有X1的地址,@ 987654331@等???? -
为了获得更多信息:同时打印对象内两个变量的地址(或相对偏移量)。间隙将显示 vtable 指针所在的位置。
标签: c++ pointers casting virtual-inheritance