dynamic_cast到派生类型失败,为什么?

时间:2011-04-02 17:46:07

标签: c++ pointers casting

我想就我面临的问题提供一些帮助。

我正在使用序列化(确切地说是TinyXml)将对象保存在文件中,并且我在反序列化方面遇到了问题。

我的对象包含指针,这些指针不是直接保存的,而是保存指向的对象的ID。

我保存的每个对象都直接或不直接派生ASerializable。

这是我的层次结构:

//Holds pure virtual method: TiXmlElement * ToXml() = 0;
class ISerializable;

// Basic implementation of ISerializable, this class has a unique ID.
class ASerializable : public ISerializable;

// For security sake, this class is not real, just a demonstration of my problem.
// Overrides TiXmlElement * ToXml()
class Base : public ASerializable;

// Overrides TiXmlElement * ToXml()
class Derived : public Base;

反序列化后,我将我创建的每个对象添加到静态映射(ID,ASerializable *)中,该映射保存数据直到取消引用。

我如何取消引用对象

我使用了一个模板类,它包含一个T **,它是所有反序列化完成后取消引用的指针。

template<typename T>
class Reference<T> {
    T** ref_ptr;
    int id; // This is the ID of the referenced object
    void Dereference();
}

基本上,Reference<T>::Dereference()获取地图中的对象,然后将其转换为良好类型(T*)并将*ref_ptr的值更改为强制转换对象。

我正在使用dynamic_cast<T*>( objects_map[id] )投射我的对象,出于某种原因,它每次都会失败。

我无法从ASerialisable*投射到Derived*而不会丢失Derived的数据。

这是我想要实现的模式:

  1. 在反序列化时,该项将自身添加到对象图;

  2. 如果对象是引用,请将一个引用(具有良好类型,我知道它)添加到堆栈

  3. 完成所有反序列化后,取消堆叠所有引用并调用Dereference()

  4. 真的很开心。

  5. 非常感谢你和你的宝贵帮助,非常感谢。

    {}享受 编辑: 好的,我会尝试更清楚,但它有点复杂。

    当我解析我的XML文件时,有时会有一个名为<reference id="X">的元素:这些元素是对另一个实例的引用(ASerializable);

    当我遇到<reference>对象时,我将其添加到堆栈中,稍后将被取消引用。 当我遇到一个特定的对象时,比如<Base id="X" ... data ... />我构建它,然后我将它作为ASerializable*添加到对象图中;

    一旦我完成了所有对象的构建,我将每个引用取消堆栈并调用Dereference(),它应该获得对象的REAL INSTANCE,使用dynamic_cast将其转换为良好类型然后更改他的ref_ptr的值指向该对象。

    如果需要,请随时提出其他问题。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

好的,谢谢大家的时间。我发现了问题。

我的层次结构中的一切都很好,问题是正在复制的向量。它包含的指针随后发生了变化,因此我的Reference的ref_ptr已损坏。

{享受}