2011-02-27 3 views
7

DerivedClassBaseClass
에서 파생됩니다. 다음 중 어떻게 작동합니까?boost :: shared_ptr 및 파생 클래스 지정

boost::shared_ptr<BaseClass> a(new BaseClass()); 
boost::shared_ptr<DerivedClass> b(new DerivedClass()); 
a=b; 

question에 따라, 본인은 지금 a 점 파생 내가 a 통해 함수를 호출하는 경우베이스에 b 점 (오른쪽?)

또한

, 지금은 파생 구현을 호출 것 ? 당신은 a에 재 할당하기 때문에 ab 것 이제 DerivedClass 개체를 모두 가리 킵니다. 있습니다

답변

13
... 
a=b; 

BaseClass 오브젝트는이 시점에서 참조 카운트가 0이 될 것이므로 (다른 오브젝트를 가리 키도록 a이 재 할당 됨으로써) 파괴됩니다. a 이후

해주기 DerivedClass에 대응하는 멤버 함수를 호출 할 a 통해 DerivedClass 객체 가상 함수 호출 (DerivedClassBaseClass 정의 및 재정의)을 가리킨다.

ab이 모두 범위를 벗어날 경우 DerivedClass 개체가 삭제됩니다. 당신이 a (DerivedClass의 예를 들면, 비 가상 함수)를 통해 파생 클래스에 특정 기능에 액세스해야하는 경우

, 당신은 사용할 수 있습니다 : 물론

boost::dynamic_pointer_cast<DerivedClass>(a)->SomeFunctionOnlyInDerivedClass(); 

이 사용법을 보여줍니다 단지 간결 예입니다 . 프로덕션 코드에서는 포인터를 참조 해제하기 전에 DerivedClass에 대한 성공적인 캐스트를 거의 확실하게 테스트합니다.

+1

'static_pointer_cast'도 작동하지 않으므로 'DerivedClass'에서 비 가상 함수를 호출하는 기본 방법이 될까요? 'boost :: static_pointer_cast (a) -> SomeFunctionOnlyInDerivedClass();' – j00hi

4

DerivedClassBaseClass에서 비롯된 것으로 가정합니다. 다음과 같이 작동합니까?

예.

boost::shared_ptr<BaseClass> pbase(new DerivedClass()); 

(BaseClass로 가상 소멸자를 가지고 두 경우 모두 가정.) 스마트 포인터가 가능한 일반 포인터처럼 행동하고, BaseClass* pbase = new DerivedClass();와 같은 동작을 제공하도록 설계되어 아무 문제가 없습니다 것처럼, 평생 관리의 장점을 모두 누릴 수 있습니다. 이 질문에 다음

, 본인은 이제 유도에 a 점과 기본에 b 점 (오른쪽?)

아니, a와 b 것이다 DerivedClass의 인스턴스를 모두 가리 킵니다. 연결된 기사에서 참조하는 스왑은 연산자 = 안에있는 임시 개체에서 발생합니다. 임시 객체가 범위를 벗어나면 BaseClass 인스턴스가 삭제됩니다.

a을 통해 함수를 호출하면 파생 구현이 호출됩니까?

예. 동작은 동일하다 그래서

T * operator->() const // never throws 
{ 
    BOOST_ASSERT(px != 0); 
    return px; 
} 

: 당신이 운용자>의 구현을 보면, 그것은하지 모든 기본 운용자>가 호출 할 수있는 포인터를 반환이다 일반 포인터.

3

a = b를 할 때 a가 가리키는 대상 b를 가리 키도록 지시합니다. 그래서 여러분이 호출하는 모든 메서드는 b 점의 BaseClass 부분을 호출합니다.

DerviedClass에서 덮어 쓰는 가상 메서드가 포함되어있는 경우 덮어 쓰기 된 버전이 호출됩니다.

관련 문제