2013-08-12 4 views
2

추상적 유형에 shared_ptr 대신 make_shared을 사용할 수 있습니까?make_shared 및 추상 다형성

예 :

int main() 
{ 
    std::vector<std::shared_ptr<Foo>> vec; 
    vec.push_back(std::static_pointer_cast<Foo>(std::make_shared<Bar>())); 
} 

그러나 그것은 또한 그것없이 작동합니다 :

vec.push_back(std::make_shared<Bar>()); 

이 여기 명시 적 캐스트를 언급 할하려면

#include <memory> 
#include <vector> 

class Foo 
{ 
public: 
    virtual void fooFunc() = 0; 
}; 

class Bar : public Foo 
{ 
public: 
    void fooFunc() {}; 
}; 

int main() 
{ 
    std::vector< std::shared_ptr<Foo> > vec; 

    vec.push_back(std::shared_ptr<Foo>(new Bar())); 
    //vec.push_back(std::make_shared<Foo>(new Bar())); //doesn't work because Foo is abstract 

    return 0; 
} 

답변

3

당신은 std::static_pointer_cast를 사용할 수있다 동작을 보여주는 데모 : Demo

new과 조합하여 std::make_shared을 사용하지 않는 것이 좋습니다. 여기 성능 문제가 있으며 제 의견으로는 new/delete의 불균형을 피하는 것이 좋습니다.

+0

'make_shared'와'new'는 어쨌든 완전히 잘못되었습니다 -'make_shared'는 이미 객체를위한 저장 공간을 할당합니다. – Xeo