如何将基类指针数组转换为派生类

时间:2017-09-27 18:26:15

标签: c++ casting

我们如何将基类指针数组转换为派生类指针数组。以下代码显示了我正在尝试做的一个简单示例:

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投射到CFirstClassCSecondClass,我试过

CFirstClass* wFirstClass = static_cast<wFirstClass*>(m_firstItem);

这似乎不起作用,有什么方法可以如何进行这种演员表?

2 个答案:

答案 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]);