저는 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;
내가 이런 종류의 정보는 코드에서 컴파일러에 의해 유도 될 수 있다고 생각하지만,에 안전 이 모든 컴파일러에서 작동한다고 가정하십니까?
추가 질문 : 하위 클래스 위치의 순서를 강제로 지정할 수 있습니까? 예를 들어, 클래스 C가 하위 클래스 인 것처럼 classA가 먼저 있어야합니다 (본질적으로 동일한 포인터 위치 공유). 먼저 하위 클래스 선언에 먼저 넣어야합니까? 업데이트 주문을 강제로 할 수없는 것 같습니다. 수퍼 클래스 레벨에서 구조의 "루트"주소, 서브 클래스에 할당 된 주소의 시작을 찾을 수 있습니까? 예를 들어 ClassA에서 classB의 주소를 가져 오는 경우를 예로들 수 있습니다.
_ "루트"_ 주소를 얻을 수 있다고 생각하지 않습니다. 나는 그것에 대해 별도의 질문을 할 것이다. 표준 AFAICT를 사용하면 기본 클래스 멤버 또는 하위 객체가 하위 메모리 주소에 배치되지 않을 수도 있습니다. 다시 말해, the_a가 the_b 또는 그와 비슷한 것보다 낮은 주소를 가지고 있다는 보장은 없습니다. –