2010-11-25 2 views
0

한다고 가정 우리가 :정적 캐스트

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(); 
} 

질문은 : 나는 항목항상복합을 상속 일부 클래스는 것을 보장 할 수있는 경우, 예를 안전하게 다음인가?

void test (Component *item) { 
    if (item.isComposite()) { 
    Composite *comp = static_cast<Composite*>(item); 
    ... 
    } 
    ... 
} 

는 내가 안전을 위해 dynamic_cast는 사용할 수 있기 때문에이 조금 이상한 예는 것을 알고 있지만, 그것은 static_cast 함께 할 수 있는지 궁금했다.

배경 : Qt Graphics View Framework에 문제가 있습니다. 즉, 항목을 원래 클래스 (예 : IconNode -> IconNode, Compsite -> Composite)로 캐스팅하는 T qgraphicsitem_cast (QGraphicsItem * item) 함수가 있지만 상속 체인 중간에 클래스로 캐스팅 할 수 없습니다 (IconNode -> Composite)을 사용하여 클래스를 인식하고 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; 
} 
+0

"상속 체인의 마지막 클래스"는 무엇을 의미합니까? 가장 파생 된 것? – lijie

+0

예. 이 예제는 IconNode 클래스와 ImageNode 클래스입니다. 클래스는 상속하지 않습니다. – Sasa

+0

아! 나는 마침내 그 질문을 이해한다. 기본적으로 ** 배경 ** 부분은 실제로 관련이 없습니다. – lijie

답변

1

간단한 대답은 : 네, 그것이 무엇인지 알고 있다면 안전하게 static_cast 수 있습니다.

1

dynamic_cast 거의 호환성 단지

  1. 확인 유형
  2. 사용하는 경우 static_castreturn null/throw badcast
+0

그래서 ** ** 1. ** 할 수 있기 때문에 static_cast를 사용하면 안전할까요? – Sasa

+0

예, 이미 체크했다면,'static_cast'를 안전하게 사용할 수 있습니다. –

+0

대단히 감사합니다! – Sasa