为操作基对象的函数提供派生对象数组
Provide array of derived objects to function that operates on base objects
为这个问题找到合适的标题对我来说有点困难,但这就是我的情况。假设我有一个基类和一个派生类,我是否可以传递一个接受*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++;
}
}
相关文章:
- 如何使用单独文件中的派生类访问友元函数对象
- 使用基类指针创建对象时,缺少派生类析构函数
- 为什么此派生对象无法访问基类的后递减方法?
- 将带有派生模板的对象传递给接受具有基本模板的对象的功能
- 放置派生C++的新基子对象
- 在 C++ 中将对象转换为派生类型
- 链表包含 c++ 中不同的派生类对象
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 如何在新的派生对象中获取基本对象的数据?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 获取我的基类以递增派生类对象整数
- 派生类中的对象
- 在没有默认构造函数的情况下创建的派生对象
- OOP 标识派生对象
- 如何创建派生对象的向量?
- 按基类对象访问派生类资源时出错
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- static_cast将此对象派生到C++中的基类
- 如何在构造函数完成后立即销毁从 QWindow 对象派生的内容
- 我可以判断std::type_info对象是否等于另一个对象或从另一个对象派生的类吗?