众所周知,以多态方式处理数组的项目是危险的,因为通常,基类和派生类的大小不同,指针算法很可能会失败。
void doSomethingOnBases(Base* bases, int numBases)
{
for(int i = 0; i < numBases; i++)
{
bases[i].doSomething();
}
}
//...
//...
Derived deriveds[60]; // declare 60 derived objects
doSomethingOnBases(deriveds, 60); // will crash and burn
//...
//...
但如果相反,我这样做了呢?
template <class X>
void doSomethingOnArray(X* arr, int numItems)
{
for(int i = 0; i < numItems; i++)
{
arr[i].doSomething();
}
}
//...
//...
Derived deriveds[60]; // declare 60 derived objects
doSomethingOnArray(deriveds, 60);
//...
//...
在这种情况下,编译器将看到 Derived*
被传入并生成 doSomethingOnArray(Derived*, int)
这是一个精确的类型匹配,因此,没有指针算术错误。
如果我能保证在 doSomethingOnArray()
中取消引用的任何对象都有一个 doSomething()
方法,那么这是伪造多态性的安全方法吗?
最佳答案
可以使用模板,但另一种解决方案是传递一个 Base** bases
,其中包含指向从 Base 派生的对象的指针数组。
void doSomethingOnBases(Base** bases, int numBases)
{
for(int i = 0; i < numBases; i++)
{
bases[i]->doSomething();
}
}
这将允许您保留一个混合派生对象的数组,而不仅仅是一个单一类型的 Derived
数组。
顺便说一句:请注意,如果您要使用模板化解决方案,那么您甚至不需要从 Base 继承。
关于c++ - 我可以使用模板作为多态处理数组的安全解决方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55324725/