한다고 가정 우리가 :정적 캐스트
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;
}
"상속 체인의 마지막 클래스"는 무엇을 의미합니까? 가장 파생 된 것? – lijie
예. 이 예제는 IconNode 클래스와 ImageNode 클래스입니다. 클래스는 상속하지 않습니다. – Sasa
아! 나는 마침내 그 질문을 이해한다. 기본적으로 ** 배경 ** 부분은 실제로 관련이 없습니다. – lijie