2010-01-28 5 views
1

가능한 중복 :
C++ pointer multi-inheritance fun.더 C++ 다중 상속 재미

(에 후속 : C++ pointer multi-inheritance fun)

나는 기본 REF-에서 상속을 포함하는 몇 가지 코드를 쓰고 있어요 카운팅 포인터 클래스; C++의 복잡함이 나타났습니다. 다음과 같이 나는 그것을 감소했습니다

한다고 가정 내가 가진 :

class A{int x, y;}; 
class B{int xx, yy;}; 
class C: public A, public B {int z;}; 

C c; 
C* pc = &c; 
B* pb = &c; 
A* pa = &c; 

// does pa point to a valid A object? 
// does pb point to a valid B object? 

// does pa == pb ? 

또한, 수행합니다

// pc == (C*) pa ? 
// pc == (C*) pb ? 

감사합니다!

여기서 "=="는 같은 값의 포인트를 의미합니다.

+0

대답은 여전히 ​​"꼭 필요한 것이 아닙니다." 당신은 정말로 * 달성하려고 노력하고 있습니까? –

+0

duplicate : http://stackoverflow.com/questions/2157104/c-pointer-multi-inheritance-fun – Bill

+0

이 질문에는 클래스가 구성원이 없으므로 답변이 다릅니다. – Skizz

답변

3
  • 없음
  • 없음 *

  • 하지만 C++은 메모리를 구성하는 방법을 알아야합니다. 상속 트리가있는 경우

    offset 
    0        First base class in list of base classes 
    sizeof first base class  Next base class 
    sizeof first N-1 base classes Nth base class 
    sizeof all base classes  CClass 
    

    OK, 그것은 조금 더 복잡한 것보다,하지만 당신은 기본적인 생각을해야 다음과 같이 클래스, CClass의 레이아웃입니다. int를 가정하면 다음 클래스 C는 같은 배치되는 4 바이트입니다 :

    offset 
    0    A::x 
    4    A::y 
    8    B::xx 
    12   B::yy 
    16   C:z 
    

    그러나 C 형의 목적은 C로 위에서와 같이 포인터의 모든이다 그러나 0을 상쇄 가리키는, C++ 허용 암시 적 다운 캐스팅이므로 C에 대한 포인터는 A에 대한 포인터 또는 B에 대한 포인터로 변환 될 수 있습니다. 그러나 위를 보면 B에 대한 포인터는 0이 아닌 오프셋 8에 있습니다 (C)와 A에 대한 포인터가 오프셋 0에 있습니다. 따라서 C에 대한 포인터를 B에 대한 포인터에 캐스트하면 포인터 값에 8이 추가됩니다. 이것은 B의 메소드가 'this'포인터가 B의 첫 번째 멤버 (B :: xx)를 가리키고 있다고 가정하기 때문입니다. 그러나 B에 대한 포인터로 재 해석 된 경우 C에 대한 포인터 (즉, 값이 동일합니다)는 포인터가됩니다 B가 실제로있는 곳의 8 바이트 전의 주소에, B의 모든 메소드가 A의 멤버를 사용하게됩니다.

    업 캐스팅 (마지막 두 번 전환)은 물고기의 다른 주전자입니다. B에 대한 포인터에서 B에 대한 포인터로가는 것은 B에 대한 포인터가 B의 인스턴스 또는 C + 8의 인스턴스를 가리키는 지 여부를 알 수 없기 때문에 실제로 어렵습니다. 이것은 RTTI와 동적 형변환이 들어오는 곳입니다. RTTI (Run Time Type Information)를 사용하면 B에 대한 포인터는 B가 실제로 무엇인지 설명하는 추가 정보를 포함합니다. C의 일부로 간단한 B 또는 B가 있습니다. 추가 비용, 실행 시간 및 메모리 사용량.

    마지막으로 C 스타일 캐스트의 모호성을 강조 표시합니다. C++ 스타일 캐스트 (static_cast <> 등)를 사용해야합니다. 이렇게하면 변환이 수행되는 방식이 명확 해집니다.

    * 이것은 또한 예일 수 있습니다. 컴파일러에 따라 다르며 RTTI가 켜져 있거나 꺼져있는 것 같습니다. 확실히 말할 표준 및 컴파일러 구현에 대한 세부 사항을 알아볼 필요가있다.