提供对基础对象进行操作的派生对象数组

时间:2011-08-10 21:38:40

标签: c++ arrays polymorphism

找到这个问题的合适标题对我来说有点困难,但这是我的情况。假设我有一个基类和一个派生类,我可以传递一个函数,该函数采用* base类型的参数而不是*派生的

class base
{
protected:
    float M_OutputValue;
    float M_InputValue;
public:
    virtual void CalculateOutput() = 0;
        /* more functions */
};

class derived: public base
{
public:
    void CalculateOutput(){ /*stuff*/};
    /* more functions */
};

这是一个将基类作为输入的函数。


void CalculateAllOutputs(base* basearray, int NumberofElements)
{
    int temp = 0;
    while(temp < NumberOfElements)
    {
         basearray[temp]->CalculateOutput();
         temp++;
    }
};

我想知道我是否可以将此函数传递给指向派生对象数组的指针。根据我对从派生到基础的指针的理解,它是隐含的并且没有太多担心(我查看this问题的答案)。我担心的是因为派生类有更多的成员,它占用更多的字节。这会导致数组中的成员相隔更远,因此在迭代它时,需要将更大的偏移量添加到内存地址以获取下一个元素。我想知道编译器是否处理这些问题,以便我传递数组的函数知道如何访问派生数组的成员。我也可以用模板解决我的问题,这里没有解决方案,但我正试图在多态性方面做得更好。

感谢。

2 个答案:

答案 0 :(得分:2)

您的关注是完全正确的。传递派生数组是行不通的。如果你想要一个多态对象的数组(或向量),你将不得不创建一个指针数组。这意味着你的功能看起来像这样

void CalculateAllOutputs(base** basearray, int NumberofElements)
{
    int temp = 0;
    while(temp < NumberOfElements)
    {
         basearray[temp]->CalculateOutput();
         temp++;
    }
}

答案 1 :(得分:2)

你是对的。远离阵列,最好使用

std::vector<std::unique_ptr<base>>

或者如果你没有C ++ 0x-ready编译器(如果是这种情况,那么考虑升级),你可以使用

boost::ptr_vector<base>

两者都是指针的向量,可以自动清理指向的对象。避免使用原始指针,正如你所指出的那样,普通数组只是很糟糕。

使用示例:

void calculate_outputs(const std::vector<std::unique_ptr<base>>& b)
{
    std::for_each(b.begin(), b.end(), [](const std::unique_ptr<base>& x)
    {
        x->CalculateOutput();
    });
}