저는 스마트 포인터를 아주 좋아해서 미안합니다. 제 질문이 당신에게 순진하게 보인다면. (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입니다. 사전
'dynamic_pointer_cast' 또는'static_pointer_cast'는 예상대로 작동해야합니다. 어떻게 사용했는지, 어디에서 실패했는지 보여 줄 수 있습니까? – syam
'공유'는 새로운 템플릿입니까 아니면 오타입니까? –
다음은 컴파일러 메시지입니다. 1> c : \ program files \ microsoft visual studio 11.0 \ vc \ include \ memory (369) : 오류 C2635 : 'Base *'를 'DerivedC *'로 변환 할 수 없습니다. 가상 기본 클래스에서 변환이 암시됩니다 문제는 다중 상속 있습니다 : DerivedCase 및 DerivedA에서 상속합니다. 그래서 "Base"클래스의 이중 상속 문제를 피하기 위해 virtual을 사용했습니다. – Laurent