我们如何将基类指针数组转换为派生类指针数组。以下代码显示了我正在尝试做的一个简单示例:
class CBaseClass
{
public :
int CommonValue;
};
class CFirstItem : public CBaseClass
{
public :
int firtValue;
};
class CSecondItem : public CBaseClass
{
public :
int secondValue;
};
class CThirdItem : public CBaseClass
{
public :
int thirdValue;
};
class Manager
{
public :
Manager()
{
for (unsigned int index = 0; index < 5; ++index)
{
m_firstItem[index] = new CFirstItem();
}
for (unsigned int index = 0; index < 10; ++index)
{
m_secondItem[index] = new CSecondItem();
}
for (unsigned int index = 0; index < 12; ++index)
{
m_thirdItem[index] = new CThirdItem();
}
}
private :
CBaseClass* m_firstItem[5];
CBaseClass* m_secondItem[10];
CBaseClass* m_thirdItem[12];
};
我的主要问题是如何从CBaseClass
投射到CFirstClass
或CSecondClass
,我试过
CFirstClass* wFirstClass = static_cast<wFirstClass*>(m_firstItem);
这似乎不起作用,有什么方法可以如何进行这种演员表?
答案 0 :(得分:3)
CFirstClass* wFirstClass = static_cast<wFirstClass*>(m_firstItem);
是错误的,因为w_firstItem
在上面的表达式中衰减为CBaseClass**
。
如果您可以设计自己不需要演员的节目,那将会更好。如果您必须投射,则需要使用dynamic_cast
。
CFirstClass* wFirstClass = dynamic_cast<CFirstClass*>(m_firstItem[0]);
if ( wFirstClass )
{
// Use the pointer.
}
else
{
// Deal with other cases
}
如果需要在m_firstItem
中投射每个指针,则需要使用循环。
for ( auto item : m_firstItem )
{
CFirstClass* wFirstClass = dynamic_cast<CFirstClass*>(item);
if ( wFirstClass )
{
// Use the pointer.
}
else
{
// Deal with other cases
}
}
<强>更新强>
@RemyLebeau提出了一个很好的观点。仅当dynamic_cast
拥有指向m_firstItem
的不同子类型的指针时,才应使用CBaseClass
。在您发布的代码中,由于它仅包含指向CFirstClass
的指针,因此可以使用static_cast
代替dynamic_cast
:
CFirstClass* wFirstClass = static_cast<CFirstClass*>(m_firstItem[0]);
循环版本可以类似地使用static_cast<CFirstClass*>(item)
。
答案 1 :(得分:2)
您不能简单地将一个基本指针数组类型转换为派生指针数组。指针不会指向正确的地址。如果需要一个派生指针数组,则必须创建一个单独的数组并正确地输入源项,例如:
CFirstClass* wFirstClass[5];
for (int i = 0; i < 5; ++i)
wFirstClass[i] = static_cast<CFirstClass*>(m_firstItem[i]);
与其他阵列相同:
CSecondClass* wSecondClass[10];
for (int i = 0; i < 10; ++i)
wSecondClass[i] = static_cast<CSecondClass*>(m_secondItem[i]);
CThirdClass* wThirdClass[12];
for (int i = 0; i < 12; ++i)
wThirdClass[i] = static_cast<CThirdClass*>(m_thirdItem[i]);