以下代码说明了我的问题:
#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和异常处理.
欢迎任何关于代码或设计变更的建议.
解决方法 使用 dynamic_pointer_cast 总结以上是内存溢出为你收集整理的c – boost :: shared_ptr和继承全部内容,希望文章能够帮你解决c – boost :: shared_ptr和继承所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)