我正在使用boost :: shared_ptr和boost :: dynamic_pointer_cast。我有一个基类,一个继承自该基类的接口,然后是一个继承自该基类的类。
所以A - > B - > C.我创建了一个C类型的对象,它存储为A类型的shared_ptr。然后我尝试使用dynamic_pointer_cast来键入B,但boost :: dynamic_pointer_cast返回NULL。
当我执行boost :: static_pointer_cast并使用指针时,它不会使程序崩溃。但我更愿意,如果动态演员有效。
为什么会这样?
编辑:这是代码的一个紧凑部分(否则放在这里太长了)。如果您需要的不仅仅是头文件,请告诉我。
class A
{
public:
virtual ~A();
/** Contains other virtual functions and some static functions */
protected:
A();
};
class B
{
public:
/** Pure virtual functions */
/** Note: No destructor is declared (when I next have
access to the computer I'll try adding a virtual destructor) */
protected:
B();
};
class C
{
public:
C();
virtual ~C();
/** Implementation of pure virtual functions */
};
此外,此相同代码的dynamic_pointer_cast适用于具有完全相同类的另一台计算机。这让我彻底失败了。代码也工作到大约一周前我做出改变。当我恢复更改时,问题仍然存在。
答案 0 :(得分:1)
有些代码可以提供帮助。显而易见的第一个猜测是,也许你忘了给A一个虚拟的析构函数。
答案 1 :(得分:0)
如果没有您对A
,B
和C
的定义以及您的使用情况,很难说。
将您的计划与以下内容进行比较:
#include <boost/shared_ptr.hpp>
#include <iostream>
struct A { virtual ~A() {} };
struct B : A {};
struct C : B {};
int main()
{
boost::shared_ptr<A> x(new C);
boost::shared_ptr<B> y(boost::dynamic_pointer_cast<B>(x));
std::cout << std::boolalpha
<< (y.get() != 0) << std::endl;
}