2011-11-23 45 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