std::shared_ptr 基类指针指向子类
时间: 2024-09-12 14:03:38 浏览: 109
`std::shared_ptr` 是 C++11 标准库中提供的一个智能指针,它可以自动管理对象的生命周期,当没有对象引用时会自动释放对象。使用 `std::shared_ptr` 时,可以将其基类指针指向派生类对象,这种用法得益于 C++ 的多态性。
当 `std::shared_ptr` 指向一个基类对象时,如果实际上它指向的是一个派生类对象,那么就会发生多态。这是因为在 C++ 中,如果一个派生类对象被当做基类对象来处理,那么在运行时,如果调用了一个虚函数,那么实际调用的是对象实际类型(即派生类)的版本。
为了使得这种多态行为能够正常工作,必须满足以下条件:
1. 基类中至少有一个虚函数,通常是虚析构函数,这样通过基类指针删除派生类对象时会调用正确的析构函数。
2. 使用 `std::shared_ptr` 指向基类时,确保其构造函数参数是基类类型的引用或指针,然后实际传递派生类对象的引用或指针。
使用 `std::shared_ptr` 实现多态时的代码示例如下:
```cpp
#include <memory>
class Base {
public:
virtual ~Base() {} // 基类需要一个虚析构函数
virtual void doSomething() {
// 基类方法实现
}
};
class Derived : public Base {
public:
void doSomething() override {
// 派生类重写方法实现
}
};
int main() {
std::shared_ptr<Base> basePtr = std::make_shared<Derived>(); // 使用基类智能指针指向派生类对象
basePtr->doSomething(); // 多态调用,实际调用 Derived::doSomething
return 0;
}
```
在这个例子中,尽管 `basePtr` 被声明为 `std::shared_ptr<Base>` 类型,但它实际指向一个 `Derived` 类型的对象。当调用 `doSomething` 方法时,由于 C++ 的多态性,将会执行 `Derived` 类中重写的 `doSomething` 方法。
阅读全文