boost shared_ptr 基类转到子类 boost::dynamic_pointer_cast

本文探讨了C++中boost::shared_ptr的使用方法,包括如何从派生类对象创建基类的智能指针,并演示了两种不同的向下转型方法:错误的方法导致编译失败,而正确的方法使用boost::dynamic_pointer_cast实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "boost/shared_ptr.hpp"  
  
class Base  
{  
public:  
  
    Base(){};  
    virtual ~Base(){};  
};  
  
class DeriveClass : public Base  
{  
public:  
  
    DeriveClass():Base(){};  
    virtual ~DeriveClass(){};  
};  
  
  
int main(int argc, _TCHAR* argv[])    
{    
    boost::shared_ptr<Base> ptrBase = boost::shared_ptr<DeriveClass>(new DeriveClass()); // 这样转换成功  
    // 下面出现编译错误
    boost::shared_ptr<DeriveClass> ptrDerive = dynamic_cast<boost::shared_ptr<DeriveClass> >(ptrBase);  
    // 下面正确
    boost::shared_ptr<DeriveClass> ptrDerive = boost::dynamic_pointer_cast<DeriveClass>(ptrBase); 
    return 0;
}

`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` 方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值