c – boost :: shared_ptr和继承

我正面临着一种情况,我有一个std :: vector的boost :: shared_ptrs的基类.在我的程序过程中,我需要将共享指针存储在该向量中的派生类对象中,并且在稍后的程序中,需要检索这些共享指针.

以下代码说明了我的问题:

#include <iostream>
#include <vector>
using namespace std;

#include <boost/make_shared.hpp>
#include <boost/foreach.hpp>

class Base
{
public:
    virtual ~Base()
    {
    }
};
/******************************************/

typedef boost::shared_ptr< Base > BasePtr;
/******************************************/

class Derived1 : public Base
{
public:
    void derived1_test()
    {
        cout << "derived1_test" << endl;
    }
    /******************************************/
    int i1;
};
/******************************************/

typedef boost::shared_ptr< Derived1 > Derived1Ptr;
/******************************************/

class Derived2 : public Base
{
public:
    void derived2_test()
    {
        cout << "derived2_test" << endl;
    }
    /******************************************/
    int i2;
};
/******************************************/

typedef boost::shared_ptr< Derived2 > Derived2Ptr;
/******************************************/

int main()
{
    Derived1Ptr d1 = boost::make_shared< Derived1 >();
    Derived2Ptr d2 = boost::make_shared< Derived2 >();

    vector< BasePtr > v;
    v.push_back( d1 );
    v.push_back( d2 );
    BOOST_FOREACH(BasePtr bPtr,v)
    {
        try
        {
            Derived1& d11 = dynamic_cast< Derived1& >( *bPtr );
            d11.derived1_test();
        }
        catch (const std::bad_cast& e)
        {
            Derived2& d22 = dynamic_cast< Derived2& >( *bPtr );
            d22.derived2_test();
        }
    }
    return 0;
}

在上面的代码中,如果我更改BOOST_FOREACH中的代码

Derived1& d11 = dynamic_cast< Derived1& >( *bPtr );

Derived1Ptr d11 = dynamic_cast< Derived1Ptr >( bPtr );

,我在VS2010上得到以下编译时错误

invalid target type for dynamic_cast target type must be a pointer or reference to a defined class

我的问题是我想使用boost :: shared_ptr不参考.其次,当对象引用是不同的类型(尝试使用共享指针,但是获得前面提到的编译器错误)时,我正在使用dynamic_cast将抛出一个std :: bad_cast异常.这显然很慢我想要能够使用更加面向性能方法.我正在寻找的是任何解决方案,而不是使用dynamic_cast和异常处理.

欢迎任何关于代码或设计变更的建议.

解决方法

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...