boost :: dynamic_pointer_cast在有效的强制转换中返回null

时间:2010-10-22 02:07:03

标签: c++ boost shared-ptr

我正在使用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适用于具有完全相同类的另一台计算机。这让我彻底失败了。代码也工作到大约一周前我做出改变。当我恢复更改时,问题仍然存在。

2 个答案:

答案 0 :(得分:1)

有些代码可以提供帮助。显而易见的第一个猜测是,也许你忘了给A一个虚拟的析构函数。

答案 1 :(得分:0)

如果没有您对ABC的定义以及您的使用情况,很难说。

将您的计划与以下内容进行比较:

#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;
}