2011-08-04 2 views
2

I는 다음의 클래스를 가질 경우는 차이

class A 
{ 
public: 
    A(int val) : m_valA(val) {} 

private: 
    int m_valA; 
}; 

class B : public A 
{ 
public: 
    B(int val) : A(0), m_valB(val) {} 

private: 
    int m_valB; 
}; 


    B* pb = new B; 

I는 A *를 취하는 함수, 예 않았다면 :

void func(A* pVal) {} 

을 pb가이 함수에 전달되면 저수준 메모리 레이아웃 측면에서 pval (함수에서)과 pb 포인터의 차이점은 무엇입니까?

포인터가 개체의 시작을 가리 키지 않습니까? 어떤 경우에 두 포인터가 다른가?

+0

다른 조상이나 가상 함수를 잊어 버리지 않은 경우 .. 비 변이 클래스의 단일 상속을 위해 포인터는 동일하지만 (보증되지는 않지만) – user396672

답변

1

포인터가 개체의 시작을 가리 키지 않습니까? 어떤 경우에 두 포인터가 다른가? 당신이 func(A* pVal)B 객체에 대한 포인터를 전달하면

, 다음 func() 구현 내부의 pVal 포인터는 B 개체의 A 하위 오브젝트 부분을 가리 킵니다. 사용자가 동일한 위치에 있는지 여부는 지정되지 않습니다 (예를 들어 단순한 상속 상황 인 경우 거의 확실합니다).

A 하위 개체가 실제로 다른 오프셋 (예 : 다중 상속과 관련된 경우 일 수 있음)에있는 경우 컴파일러는 호출을 컴파일 할 때 자동으로 적절한 조정을 수행합니다. 호출 사이트에서 컴파일러는 B*을 처리 중이므로 으로 변환하여 func()으로 전달해야하므로 컴파일러에서이 작업을 수행 할 수 있습니다. B이 (가) A에서 공개적으로 상속되기 때문에 안전하고 정상적인 전환입니다.

0
void func(A* pVal) {} 

pbpVal에 upcasted된다. 기본 클래스 하위 객체를 가리 킵니다. 그러나 다형성 클래스 인 경우 virtual 인 경우 재정의 된 파생 클래스 메서드를 호출합니다.

pb은 액세스 수준에 따라 두 하위 개체 구성원 모두에 액세스 할 수 있습니다. 그러나 pVal은 기본 클래스 하위 개체 멤버에만 액세스합니다. 그러나 기본 클래스가 다형성 인 경우 런타임 다형성이 가능합니다.