2013-05-13 1 views
0

저는 스마트 포인터를 아주 좋아해서 미안합니다. 제 질문이 당신에게 순진하게 보인다면. (myPointer를 호출 할 수 있습니다)C++ 스마트 포인터 폴리 모피즘

using namespace std; 

class Base 
{ 
protected: 
    int m_Property; 
public: 
    virtual function() {...;} 
} 

class DerivedA : public Base 
{ 
public: 
    virtual function() {second implementation...;} 
    virtual functionA() {...;} 
} 

class DerivedB : virtual public Base, public DerivedA 
{ 
public: 
    virtual functionB() {...;} 
} 

void main() 
{ 
    map<int, shared_ptr<Base>> myMap; 

    shared_ptr<Base> object_ptr1 = shared_ptr<Base>(new Base()); 
    shared_ptr<Base> object_ptr2 = shared_ptr<Base>(new DerivedA()); 
    shared_ptr<Base> object_ptr3 = shared_ptr<Base>(new DerivedB()); 

    myMap.insert(pair<int, shared_ptr<Base>>(1,object_ptr1)); 
    myMap.insert(pair<int, shared_ptr<Base>>(2,object_ptr2)); 
    myMap.insert(pair<int, shared_ptr<Base>>(3,object_ptr3)); 

    // What i want to do (cause I know for sure that object_ptr3 points to a DerivedB object): 
    object_ptr3->functionB(); 
} 

하자 내가에는 myMap에서 공유 포인터를 추출 한 말, 나는 DerivedB의 특정 (그러나 가상 상속되지를 사용하려는 : 여기 내가 무엇을 원하는의 예입니다) 기능. myPointer (또는 위의 예에서 object_ptr3)가 Base 유형이라고 생각하여 컴파일 된 내용을 이해하지 못합니다.

static_pointer_cast 및 dynamic_pointer_cast (일부 경우 작동하지 않음)를 사용하여 캐스팅을 시도했습니다 ... 이 상황의 왕을 처리하는 데 더 좋은 ID입니다. 사전

+2

'dynamic_pointer_cast' 또는'static_pointer_cast'는 예상대로 작동해야합니다. 어떻게 사용했는지, 어디에서 실패했는지 보여 줄 수 있습니까? – syam

+0

'공유'는 새로운 템플릿입니까 아니면 오타입니까? –

+0

다음은 컴파일러 메시지입니다. 1> c : \ program files \ microsoft visual studio 11.0 \ vc \ include \ memory (369) : 오류 C2635 : 'Base *'를 'DerivedC *'로 변환 할 수 없습니다. 가상 기본 클래스에서 변환이 암시됩니다 문제는 다중 상속 있습니다 : DerivedCase 및 DerivedA에서 상속합니다. 그래서 "Base"클래스의 이중 상속 문제를 피하기 위해 virtual을 사용했습니다. – Laurent

답변

0

dynamic_pointer_cast에서

덕분에이 경우 작동해야합니다. 캐스팅하는 동안 뭔가 잘못한 것일 수도 있습니다.
그것은 다음과 같이한다 : 당신이 . 대신 ->object_ptr3.functionB();를 호출하고 있다는

std::shared_ptr<Base> base(new Base); 
std::shared_ptr<Derived> derived = std::dynamic_pointer_cast<Derived>(base); 

다시 코드를 보면 문제가 될 수 있습니다. object_ptr3shared_ptr이므로 . 연산자는 파생 클래스가 아닌 shared_ptr 클래스의 멤버에 액세스합니다.

또한 sharedshared_ptr입니까?

+0

예, 공유는 shared_ptr입니다. 나는 이것을 바꾸기 위해 나의 질문을 편집하고있다. – Laurent

+0

답변 해 주셔서 감사합니다. 이들은 내 게시물의 오타입니다. shared_ptr에서 사용한 코드는 코드에서와 동일합니다. – Laurent