2016-12-29 108 views
0

我有什麼:訪問派生類通過指針

class Item {} ; 

class ChristmasItem : public Item 
{ 
private: 
string color; 

public: get_color() { return color;} 

class Store{ 
Item* item1; 
} ; 

現在,如果項目*物品1是ChristmasItem我要檢查它的顏色。我試過

if (dynamic cast <ChristmasItem*> item1! =NULL) item1->get_color() ; 

沒有成功。你能給我任何建議嗎?

回答

2

你的代碼不正確使用dynamic_cast。您必須定義您計劃存儲演員的所需類型的變量。

ChristmasItem *thisItem = dynamic_cast<ChristmasItem*>(item1); 

然後:

if (thisItem != nullptr) thisItem->getColor(); 

請注意,運行時類型信息(RTTI)需要這個工作,而且必須在某些開發環境中啓用。

+0

你可以* *直接定義'if'聲明,如內部變量: 'if(ChristmasItem * thisItem = dynamic cast (item1))thisItem-> get_color();' –

+0

@RemyLebeau是的,你可以。如果你只需要'for'語句範圍的對象,那將是首選的方法。但是並不需要解決這個問題。 –

1

那麼有代碼中的許多問題,如果你問特別是對dynamic_cast的,然後將dynamic_cast只能如果你有虛函數應用。

+2

更確切地說,基類「Item」必須是多態類型(即至少有一個虛函數)才能使用運行時檢查的'dynamic_cast'。 – songyuanyao

+0

所以正常的項目也應該有顏色屬性和虛擬get_color();? – sadboy

+0

是的,虛擬字符串get_color(); –

1

你的代碼是接近完成你的目標,它只是需要一些調整。

首先,您需要添加虛擬方法到Item才能使用dynamic_cast。在這種情況下,虛析構函數就足夠了:

class Item { 
public: 
    virtual ~Item() {} 
}; 

其次,改變你的dynamic_cast聲明如下:

if (ChristmasItem *item = dynamic cast<ChristmasItem*>(item1)) 
    item->get_color();