访问派生类通过指针

问题描述:

我有什么:访问派生类通过指针

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

没有成功。你能给我任何建议吗?

你的代码不正确使用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'语句范围的对象,那将是首选的方法。但是并不需要解决这个问题。 –

那么有代码中的许多问题,如果你问特别是对dynamic_cast的,然后将dynamic_cast只能如果你有虚函数应用。

+2

更确切地说,基类“Item”必须是多态类型(即至少有一个虚函数)才能使用运行时检查的'dynamic_cast'。 – songyuanyao

+0

所以正常的项目也应该有颜色属性和虚拟get_color();? – sadboy

+0

是的,虚拟字符串get_color(); –

你的代码是接近完成你的目标,它只是需要一些调整。

首先,您需要添加虚拟方法到Item才能使用dynamic_cast。在这种情况下,虚析构函数就足够了:

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

其次,改变你的dynamic_cast声明如下:

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