gpt4 book ai didi

c++ - boost::shared_ptr 和继承

转载 作者:可可西里 更新时间:2023-11-01 15:38:20 24 4
gpt4 key购买 nike

我面临这样一种情况,我有一个基类的 boost::shared_ptrstd::vector。在我的程序过程中,我也需要在该 vector 中存储指向派生类对象的共享指针,并且在程序稍后的某个时间,需要检索这些共享指针。

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

#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++ - boost::shared_ptr 和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5181183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com