提问者:小点点

如何使用std::make_shared创建基类类型的智能指针?


我在这里做错了什么? 我不敢相信下面没有编译。 需要使用共享指针强制转换之类的吗?

struct Base
{
};

class Child : Base
{
};

int main()
{
    std::shared_ptr<Base> p = std::make_shared<Child>();
}

我在使用Microsoft编译器时遇到的错误是

error C2440: 'initializing': cannot convert from 'std::shared_ptr<Child>' to 'std::shared_ptr<Base>'

共3个答案

匿名用户

确实有用。 只是基本具有私有继承。

struct Child : Base{};

class Child : public Base{};

都是修复。 有趣的是,std::static_pointer_cast和company确实存在; 但你不需要他们在这里。 参见https://en.cppreference.com/W/cpp/memory/shared_ptr/pointer_cast

匿名用户

您应该改用公共继承:

class Child : public Base
{
};

匿名用户

虽然@Bathsheba和@Divinas的回答解决了这个问题,但他们都没有解释为什么这是解决问题的方法,我认为对于未来的观众来说,知道为什么这是问题所在是很重要的。

当您试图创建指向基类base的指针时,您试图获得对属于派生类(在本例中为child)的基类的所有公共成员的访问权限。 如果派生类私有地继承基类(或受保护地继承基类),则基类中标记为公共的所有成员现在都标记为私有(或受保护)。 这意味着试图以公共成员身份访问它们将引起访问权限冲突问题。 由于访问权限在编译时已知,因此这是一个编译错误。

解决方案,正如前面的回应中提到的,是使用公共继承来继承基类。 它是结构中的默认继承,是中的非默认继承。