make_shared(子类指针)赋值给父类指针std::shared_ptr<父类指针>报错
时间: 2024-08-27 10:01:01 浏览: 102
当你试图使用 `make_shared` 创建一个指向子类的 `std::shared_ptr` 赋值给父类的指针时,可能会遇到编译错误,因为这违反了 C++ 的类型安全原则。`std::shared_ptr` 指向的是具体的类型,并不是指针类型本身,所以在赋值时它会检查实际存储的对象是否匹配所指向的类型。
例如:
```cpp
class Parent {};
class Child : public Parent {};
std::shared_ptr<Parent> parentPtr; // 存储父类指针
std::shared_ptr<Child> childPtr = std::make_shared<Child>(); // 创建子类指针
parentPtr = childPtr; // 这行会出错,因为childPtr实际上指向Child,而parentPtr期望是Parent
```
当你尝试这样做时,编译器会报错,通常是因为找不到从子类到父类的隐式转换。解决这个问题有两种常见方法:
1. **向下转型**(Downcast):如果你确实需要父类指针持有子类对象,可以使用 `dynamic_cast` 或者 `static_cast` 来显式地转换子指针:
```cpp
parentPtr = dynamic_cast<Parent*>(childPtr.get());
```
2. **模板共享所有权**(Using shared ownership with templates):如果父类和子类之间有共同的行为,你可以使用 CRTP(Component-Resource Template Pattern)设计模式,或者使用一些库提供的通用智能指针(如 Boost Smart Pointers 中的 `enable_shared_from_this`),让子类能够自动为父类提供共享所有权。
请确保你的操作符合法并且不会导致运行时错误,比如空指针引用。
阅读全文