我已经声明了一个类,所以我总能得到它的父节点:
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下试过这个,行为相同。
我完全不明白。