函数返回定义的不同类型的类,导致分段错误

时间:2016-05-20 12:46:56

标签: c++ qt segmentation-fault

我已经声明了一个类,所以我总能得到它的父节点:

class EObject {
private: 
  EObject *mother;
public:
  EObject(EObject *mother=0);
  EObject *getMother() const {return mother;};
....
}

现在我有几个继承这个类的类,如:

class EProperty : public QObject, public EObject {
Q_OBJECT
 ....
}

根节点是EModel,它继承QAbstractItemModel

class EModel : public QAbstractItemModel,public EObject{
Q_OBJECT
...
    virtual QModelIndex parent(const QModelIndex &child) const {
        EObject *node =0;
        if ( child.isValid() ) {
            node = static_cast<EObject*>(child.internalPointer());
        } 

        if ( !node )
            return QModelIndex();

        EObject *parentNode = node->getMother();
        if ( !parentNode ) {
            // There are no parents
           return QModelIndex();
        }

        EObject *grandParentNode = parentNode->getMother();
        if ( !grandParentNode ) {
            // There are no parents
            return QModelIndex();
        }
        int row = grandParentNode->eChildren().indexOf(parentNode); 
        return createIndex(row,0,parentNode);
 }

现在我添加了一些新类:

class EParameter :public EProperty
{
    Q_OBJECT
    ....
 }

class EEnumeration :public EProperty
{
    Q_OBJECT
....

}

现在如果我使用EParameter一切都很好。但如果我使用EEnumeration,我会在函数int row = grandParentNode->eChildren().indexOf(parentNode);

的这一行virtual QModelIndex parent(const QModelIndex &child) const中出现细分错误

真正奇怪的是,GDB说grandParentNode声明为EObject*的类型为QObjectPrivate*。我不知道怎么会发生这种情况。 我从不在任何地方触摸getMother()函数。它也没有区别,因为它不是虚拟的。

此外,如果我通过写:

双重检查返回值
EObject *grandParentNode = dynamic_cast(EObject*)(parentNode->getMother());

GDB仍然说grandParentNode的类型为QObjectPrivate

所以问题是,即使在dynamic_cast之后,指针如何成为与声明不同的类型?

我也试着一步一步地使用GDB,在函数getMother()中,一切似乎都很好this很好,*mother的值也很好。当我更进一步,以便我回到函数parent时,返回的值不是他在一秒钟前给我看的那个。

我在windows 10 / qt 5.5.1 / mingw 492_32和CentOS7.2 / qt 5.6.0 / g ++ 4.8.4下试过这个,行为相同。

我完全不明白。

enter image description here

0 个答案:

没有答案