为操作基对象的函数提供派生对象数组

Provide array of derived objects to function that operates on base objects

本文关键字:对象 派生 数组 操作 函数      更新时间:2023-10-16

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

<>之前阶级基础{保护:浮动M_OutputValue;浮动M_InputValue;公众:虚拟void CalculateOutput() = 0;/*更多的函数*/};派生的类:公共基{公众:void CalculateOutput(){/*stuff*/};/*更多的函数*/};之前

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

<>之前void CalculateAllOutputs(base* basearray, int NumberofElements){Int temp = 0;while(temp <NumberOfElements){basearray(临时)-> CalculateOutput ();临时+ +;}};之前

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

谢谢。

你是对的。不要使用数组,最好使用

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

或者如果您没有支持c++ 0的编译器(如果是这种情况,请考虑升级),您可以使用

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

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

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