C ++子类化,继承和转换

时间:2011-02-09 06:20:07

标签: c++ qt inheritance casting

这个特定的难题很难解释,所以我会尽我所能。

在Qt框架中,有两个类:QTreeWidget和QTreeWidgetitem。

我已经将QTreeWidgetitem子类化了:


class MyQTreeWidgetitem : public QObject, public QTreeWidgetitem
{

...

public:
  int myCustomVariable;
}

我将此添加到QTreeWidget中,执行以下操作:


MyQTreeWidgetitem *item = new MyQTreeWidgetitem;
item->myCustomVariable = 10;

tree->addTopLevelItem(item);

现在,如果我需要调用tree-> topLevelItem(x),我得到的就是QTreeWidgetitem *。

然而,我所追求的是MyQTreeWidgetitem *所以我:


MyQTreeWidgetItem *theitem = (MyQTreeWidgetItem*)tree->topLevelItem(n);

问题是theitem-> myCustomVariable不再等于10.

有没有办法保持MyQTreeWidgetitem完好无损?

2 个答案:

答案 0 :(得分:3)

我不知道Qq,但你可以尝试做一个正确的dynamic_cast<>,它将验证对象是否实际上是MyQTreeWidgetItem*(否则返回0),以及正确执行指针转换(我不确定C风格的演员表是否返回了QObject的地址)。您可以打印指针并更深入地了解这个问题。

答案 1 :(得分:2)

在C ++程序中使用C风格的强制转换通常是一个坏主意。将它用于原始类型可能没问题,但对于类应该避免使用它。虽然在这种特殊情况下它可能没问题,但有一天你会因为它而陷入深深的麻烦。

使用dynamic_cast<>可能没问题。由于您不使用虚拟继承,您可能也希望使用static_cast<>,它的优点是不需要RTTI(某些平台可能支持不好)并且速度稍快。我还听说dynamic_cast有时在共享库边界上无法正常工作。

对于QObject子类之间的向下转换,Qt中还有qobject_cast<>可用。在这种情况下它不会帮助你,因为QTreeWidgetItem不是QObject的子类,但可以帮助你在其他地方需要从QObject *转换到MyQTreeWidgetItem *。如果你使用Qt插件机制,它也用于转换为接口。