找到这个问题的合适标题对我来说有点困难,但这是我的情况。假设我有一个基类和一个派生类,我可以传递一个函数,该函数采用* 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问题的答案)。我担心的是因为派生类有更多的成员,它占用更多的字节。这会导致数组中的成员相隔更远,因此在迭代它时,需要将更大的偏移量添加到内存地址以获取下一个元素。我想知道编译器是否处理这些问题,以便我传递数组的函数知道如何访问派生数组的成员。我也可以用模板解决我的问题,这里没有解决方案,但我正试图在多态性方面做得更好。
感谢。
答案 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();
});
}