Static_cast在继承链的中间

时间:2010-11-25 16:24:37

标签: c++ casting

假设我们有:

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 - &gt; IconNode,Compsite - &gt; Composite),但它不能转换为继承链中间的类(IconNode - &gt; 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;
}

2 个答案:

答案 0 :(得分:1)

dynamic_cast几乎就是

  1. 检查兼容性类型
  2. 如果可以,请使用static_cast,否则使用return null / throw badcast

答案 1 :(得分:1)

简单的答案是:是的,如果您知道它是某种东西,您可以static_cast安全地使用它。