【发布时间】:2021-04-08 22:42:49
【问题描述】:
我在 C++ 中使用多重继承已经有很长一段时间了,但直到今天才意识到这可能意味着当将它们作为子类之一引用时指针地址可能不同。
例如,如果我有:
class ClassA{
public:
int x;
int y;
ClassA(){
cout << "ClassA : " << (unsigned int)this << endl;
}
};
class ClassC{
public:
int cc;
int xx;
ClassC(){
cout << "ClassC : " << (unsigned int)this << endl;
}
};
class ClassB : public ClassC, public ClassA{
public:
int z;
int v;
ClassB(){
cout << "ClassB : " << (unsigned int)this << endl;
}
};
int main(){
ClassB * b = new ClassB();
}
在构造函数上打印时,A 类和 C 类具有不同的地址。
然而,当我尝试将它们相互转换时,它只是自动工作:
ClassA * the_a = (ClassA*)b;
cout << "The A, casted : " << (unsigned int)the_a << endl;
ClassB * the_b = (ClassB*)the_a;
cout << "The B, casted back : " << (unsigned int)the_b << endl;
我想这种信息可以由编译器从代码中推导出来,但是假设这适用于所有编译器是否安全?
附加问题:是否可以强制子类位置的顺序?例如,如果我需要首先将 classA 定位(本质上,共享相同的指针位置)作为子类的 ClassC,我只需要将它放在子类的声明中吗? 更新好的,看来无法强制下单。是否仍然可以在超类级别找到结构的“根”地址,即分配给子类的地址的开始?例如,从 ClassA 中获取 classB 的地址。
【问题讨论】:
-
我不相信你能得到 "root" 地址。不过,我会问一个单独的问题。根据标准的 AFAICT,甚至不能保证基类成员或子对象被放置在较低的内存地址中。换句话说,不能保证
the_a的地址低于the_b或类似的地址。