2010-10-22 85 views
0

我使用boost :: shared_ptr和boost :: dynamic_pointer_cast。我有一个基类,一个从该基类继承的接口,然后是一个从该类继承的类。boost :: dynamic_pointer_cast在有效转换时返回null

所以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在另一台具有完全相同类的计算机上工作。这让我完全丧失了信心。代码也工作到一个星期前,当我做出改变。当我恢复了这个改变时,问题仍然存在。

+1

后的代码,这是不可能的肯定告诉什么是错的没有这种。 – 2010-10-22 02:41:02

+0

你使用什么编译器?哪些编译选项?几乎所有的编译器都有禁用RTTI的方法,你是否偶然做到这一点?用raw指针(而不是boost :: shared_ptr)的dynamic_cast是否有效? – EFraim 2013-01-30 19:43:28

回答

1

一些代码会有所帮助。第一个明显的猜测是,你可能忘了给A一个虚拟析构函数。

+1

它不需要*虚拟析构函数(尽管强烈推荐!),它需要*虚拟函数。 – GManNickG 2010-10-22 02:16:48

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; 
} 
相关问题