6pa*_*kid 10 c++ inheritance shared-ptr
我现在面临的,我有一个情况std::vector的boost::shared_ptr一个基类的秒.在我的程序过程中,我需要将共享指针存储到该向量中的派生类对象,并且稍后在程序中,需要检索这些共享指针.
以下代码说明了我的问题:
#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;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,如果我更改代码BOOST_FOREACH从
Derived1& d11 = dynamic_cast< Derived1& >( *bPtr );
Run Code Online (Sandbox Code Playgroud)
至
Derived1Ptr d11 = dynamic_cast< Derived1Ptr >( bPtr );
Run Code Online (Sandbox Code Playgroud)
,我在VS2010上得到以下编译时错误
invalid target type for dynamic_cast target type must be a pointer or reference to a defined class
Run Code Online (Sandbox Code Playgroud)
我的问题是我想要boost::shared_ptr不使用引用.其次,我正在使用当对象引用属于不同类型时dynamic_cast会抛出std::bad_cast异常(尝试使用它与共享指针,但得到前面提到的编译器错误).这显然非常缓慢.我希望能够使用更加注重绩效的方法.我在这里寻找的是任何解决方案,而不是使用dynamic_cast和异常处理.
欢迎任何关于代码或设计变更的建议.
你的设计似乎忽略了这一点; 最好使用virtual函数来实现多态行为.
#include <iostream>
#include <vector>
using namespace std;
#include <boost/make_shared.hpp>
#include <boost/foreach.hpp>
class Base
{
public:
virtual ~Base() {}
virtual void test() = 0;
};
/******************************************/
typedef boost::shared_ptr< Base > BasePtr;
/******************************************/
class Derived1 : public Base
{
public:
void test()
{
cout << "derived1_test" << endl;
}
/******************************************/
int i1;
};
class Derived2 : public Base
{
public:
void test()
{
cout << "derived2_test" << endl;
}
/******************************************/
int i2;
};
int main()
{
BasePtr d1 = boost::make_shared< Derived1 >();
BasePtr d2 = boost::make_shared< Derived2 >();
vector< BasePtr > v;
v.push_back( d1 );
v.push_back( d2 );
BOOST_FOREACH(BasePtr &bPtr, v) // I use a reference here for efficiency.
{
bPtr->test();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)