2013-08-12 3 views
2

Есть ли способ использовать make_shared вместо shared_ptr для абстрактных типов?make_shared и абстрактный полиморфизм

Пример:

#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, если вы хотите быть оговаривая бросок:

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>()); 

Вот демонстрация поведения: Demo

Я бы рекомендовал не использовать std::make_shared в сочетании с new. Здесь есть проблема с производительностью, и, на мой взгляд, это хорошая вещь, чтобы избежать несбалансированного new/delete.

+0

'make_shared' с' new' в любом случае является абсолютно неправильным - 'make_shared' уже выделяет хранилище для объекта. – Xeo

Смежные вопросы