我使用boost :: any来获得多态类型,我需要能够将一个对象转换为它的基类型。
class A {
public:
int x;
virtual int foo()= 0;
};
class B : public A {
public:
int foo() {
return x + 1;
}
};
int main() {
B* bb = new B();
boost::any any = bb;
bb->x = 44;
A* aa = boost::any_cast<A*>(any);
}
main函数的代码在运行时抛出以下错误:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_any_cast> >'
what(): boost::bad_any_cast: failed conversion using boost::any_cast
Abort trap
如果我在boost :: any_cast代码中为reinterpret_cast更改static_cast,它似乎有效。但是我不确定其后果。
你有什么想法吗?
答案 0 :(得分:8)
Upcasts(指向base的指针)不需要在C ++中进行显式转换。
另一方面,boost::any_cast
只有在转换为与最初存储的完全相同的类型时才会成功。 (IIRC使用typeid来检查您是否正在尝试访问正确的类型,而typeid比较仅适用于完全匹配。)
因此:
A* aa = boost::any_cast<B*>(any);
但是,有些人不清楚为什么要将boost::any
用于多态类型。特别是,它不是智能指针,不会删除存储的对象。更常见的是在智能指针中存储指向多态对象的指针,例如boost::shared_ptr<A>