如何动态投射boost::scoped_ptr?
How to dynamically cast a boost::scoped_ptr?
我很惊讶编译器拒绝编译这种代码:
class A { virtual ~A() {} };
class B : public A { virtual ~B() {} void foo() {} };
//...
boost::scoped_ptr<A> p1(new B);
boost::scoped_ptr<B> p2 = boost::dynamic_pointer_cast<B>(p1);
p2->foo();
为什么这不可能?最好的方法是什么?
我找到了这个解决方案:
boost::scoped_ptr<A> p1(new B);
B* p2 = dynamic_cast<B*>(p1.get());
p2->foo();
有没有办法只使用智能指针?
注意:出于兼容性原因,我不使用 C++11。
p1
拥有 B
对象,并将在其析构函数中将其删除。如果您允许创建第二个智能指针 (p2
),它也将在其析构函数中删除该对象,那么您就会遇到问题。
就我个人而言,我会使用转换为引用而不是指针,但除此之外,您找到了唯一的解决方案。
我很惊讶编译器拒绝编译这种代码:
class A { virtual ~A() {} };
class B : public A { virtual ~B() {} void foo() {} };
//...
boost::scoped_ptr<A> p1(new B);
boost::scoped_ptr<B> p2 = boost::dynamic_pointer_cast<B>(p1);
p2->foo();
为什么这不可能?最好的方法是什么?
我找到了这个解决方案:
boost::scoped_ptr<A> p1(new B);
B* p2 = dynamic_cast<B*>(p1.get());
p2->foo();
有没有办法只使用智能指针?
注意:出于兼容性原因,我不使用 C++11。
p1
拥有 B
对象,并将在其析构函数中将其删除。如果您允许创建第二个智能指针 (p2
),它也将在其析构函数中删除该对象,那么您就会遇到问题。
就我个人而言,我会使用转换为引用而不是指针,但除此之外,您找到了唯一的解决方案。