如何使用 std::make_shared 创建基类类型的智能指针?
How do you use std::make_shared to create a smart pointer of a base class type?
我在这里做错了什么?我不敢相信下面的不编译。是否需要使用共享指针转换或其他内容?
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>'
它确实有效。只是Base
有private
传承。
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
(。如果派生类私下继承基类(或受保护继承基类(,则派生类内标记为私有(或受保护(的基类中标记为公共的所有成员现在都标记为私有(或受保护(。这意味着尝试以公共成员身份访问它们将引发访问权限冲突问题。由于访问权限在编译时是已知的,因此这是一个编译错误。
如前面的响应中所述,解决方法是使用公共继承继承基类。这是struct
s 中的默认继承和class
es 中的非默认继承。
您应该改用公共继承:
class Child : public Base
{
};
相关文章:
- 如何使用 std::make_shared 创建基类类型的智能指针?
- 构造智能点数据类型以及普通数据类型的通用方法
- 如何将字符串指针数组转换为字符串类型的智能指针向量?
- 使用智能指针指向 C 库中的结构,该结构通过 typedef 隐藏实现(即不完整的类型)
- 是否允许调用方对我的 Builder 类使用任何指针类型(包括智能指针)?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 我在代码中有一个错误,错误是:(智能感知:不允许抽象类类型"HourlyWorker"的对象:)
- 智能感知:不能使用 "PVOID" 类型的值初始化 "_NtQuerySystemInformation" 类型的实体
- 哪种智能指针类型
- 如何在类中存储指向字符串到成员函数映射的智能指针,以便它不会因类型不完整而失败?
- 我可以省略头文件中智能指针的类型参数吗?
- API返回类型--强制将智能指针指向用户
- 智能感知:数组可能没有这种类型的元素
- 智能感知:不能将 "void" 类型的值分配给类型 "double" 的实体
- 智能感知:表达式必须具有积分或枚举类型
- SDL 类型的智能指针包装器是否安全
- 可以从模板化的智能指针仅继承类型类吗
- 智能感知:类型 "HWND" 的参数与类型 "rawData::HWND" 的参数不兼容
- 工厂函数的最佳智能指针返回类型是什么
- 测试类型是否为(智能)指针的通用方法