2011-11-23 43 views
-1

我有:(伪码)如何将一个对象转换为由其超类继承的类?

A_GItem_rect::A_GItem_rect () : QGraphicsRectItem() , A_GItem_base() 

确定,G_graphicsRcetItem,反过来,继承QGRaphicsShapeitem

G_item_base有一个w_setPen()方法。

它里面的任何下一命令意思是chrash的:

((QAbstractGraphicsShapeItem *) this)->setPen(my_pen); 
QAbstractGraphicsShapeItem * r = reinterpret_cast<QAbstractGraphicsShapeItem*>(this) ; 

我怎样才能解决这个问题。谢谢

+0

你提到你的问题7个不同的类别:'A_GItem_rect','QGraphicsRectItem','A_GItem_base G_graphicsRcetItem,QGRaphicsShapeitem,G_item_base,QAbstractGraphicsShapeItem。真的不清楚哪些是相关的,它们之间的关系是什么。 – interjay

回答

2

你为什么要做这么可怕的事情?

A_GItem_rectQAbstractGraphicsShapeItem一个子类,那么你不必到CAS的this指针访问setPen方法。一个简单的this->setPen()应该就足够了。如果您明确要求该方法的QAbstractGraphicsShapeItem版本,则必须将其称为:QAbstractGraphicsShapeItem::setPen()

reinterpret_cast不好!特别是当你不知道你在做什么。如果您确实需要投射物体,请先尝试dynamic_cast

+0

但是我需要/想要在A_Gitem_Base中获得有关笔的信息。在设置笔之前,我可能会利用这些信息做些什么。这是因为我需要访问A_Gitem_rect的QAbstracGrapchisShapeItem超类(或基类)的setpen。 – tonnot

+0

而且......里面A_Gitem_base我无法访问给超...这是因为我尝试设置使用QAsbtractGrapchisShapeItem ..... – tonnot

+0

你根本不应该有使用此功能的笔。也许你可以用另一个继承方案来尝试。 E.G:让'A_Gitem_Base'成为'QAsbtractGrapchisShapeItem'的子类。 – Constantinius

0

你应该使用dynamic_cast,而不是当你的类层次结构移动,然后检查返回值,看看是否成功(!=NULL

+0

是的,但这几乎肯定不是OP问题的正确解决方案。 – leftaroundabout