假设我们有:
class Component : public QGraphicsItem {
...
virtual void paintMe() = 0;
virtual void doSomething();
virtual bool isComposite() const { return false; }
}
class Composite: public Component {
...
void addChildren(Component *);
void removeChildren(Component *)
bool isComposite() const { return true; }
}
class IconNode: public Composite {
...
void paintMe();
}
class ImageNode: public Composite {
...
void paintMe();
}
问题是:如果可以保证项目始终是继承Composite的某个类,以下示例是否安全?
void test (Component *item) {
if (item.isComposite()) {
Composite *comp = static_cast<Composite*>(item);
...
}
...
}
我知道这是一个有点奇怪的示例,因为我可以使用dynamic_cast来确保安全,但是我想知道是否可以使用static_cast来完成。
背景:
我在使用Qt Graphics View Framework时遇到麻烦。即,它具有函数T qgraphicsitem_cast(QGraphicsItem * item),该函数将项目强制转换为原始类(例如IconNode-> IconNode,Compsite-> Composite),但不能强制转换为继承链中间的类(IconNode-> Composite) ),因为它使用函数type()识别类,并且因为IconNode和Composite的type()不同,所以转换失败。
可以通过以下示例解决此问题,但是我想知道前面的示例是否可以安全地完成此工作:
Composite * castItem (QGraphicsItem *item) {
if (item != 0) {
switch(item.type()) {
case IconNode::Type:
return qgraphicsitem_cast<IconNode*>(item);
case ImageNode::Type:
return qgraphcisitem_cast<ImageNode*>(item);
}
}
return 0;
}
最佳答案
简单的答案是:是的,如果您知道它是什么,则可以安全地static_cast
对其进行操作。