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

How do you use std::make_shared to create a smart pointer of a base class type?

本文关键字:类型 智能 基类 指针 shared std 何使用 make 创建      更新时间:2023-10-16

我在这里做错了什么?我不敢相信下面的不编译。是否需要使用共享指针转换或其他内容?

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>'

它确实有效。只是Baseprivate传承。

struct Child : Base{};

class Child : public Base{};

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

尽管@Bathsheba和@divinas的回答解决了这个问题,但他们都没有解释为什么这是解决方案,我认为让未来的观众知道为什么在这种情况下是问题是很重要的。

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

如前面的响应中所述,解决方法是使用公共继承继承基类。这是structs 中的默认继承和classes 中的非默认继承。

您应该改用公共继承:

class Child : public Base
{
};