만약 public을 통해 다중상속을 한다면 static_cast를 통해 쉽게 상위 클래스로 형변환이 가능하다.
하지만 부모의 멤버를 감추기 위해 private으로 상속한다면 static_cast를 사용할 수 없다.
struct A {
unsigned int data;
};
struct B {
unsigned short data;
};
class C : A, B {
public:
C() {
A::data = 0xA;
B::data = 0xB;
C::data = 0xC;
}
unsigned char data;
};
다음과 같은 상황이라고 치자. 이때 클래스 C로 변수를 만들면 메모리 뷰 관점에서는 다음과 같을 것이다. (public 상속을 해도 같은 결과가 나온다)
[A:4byte][B:2byte][C:1byte]
만약 c의 주소를 통해 B로 reinterpret_cast 한다면 A의 주소값을 기반으로 캐스팅되기 때문에 컴파일은 가능하지만, 원하는 값을 얻어오기는 불가능하다.
쉽게 해결하기 위해서는 그냥 public 상속을 하는 것이지만, 나는 어떻게는 상위 클래스를 감추고 싶다면 다음과 같은 방법이 있다.
reinterpret_cast<B*>(reinterpret_cast<A*>(&c)+1)->data = 0xD;
매-우 불편하지만 가능은 하다.
과정은 A로의 형변환을 통해 주소크기를 4로 바꾼 뒤, 주소 다음값을 B로 형변환한 것이다.
'C++' 카테고리의 다른 글
[C++] vcpkg 라이브러리 패키징 (0) | 2024.08.07 |
---|---|
[C++] 제대로 알고 사용하자. atd::async (0) | 2024.07.13 |
[C++] C++에서 라이브러리를 관리해보자 (0) | 2024.06.27 |
[C++/Unreal] 커스텀 RPC 구현 기록 (0) | 2024.05.31 |
[C++] 에러코드를 메세지로 format하기 (0) | 2023.11.17 |