c++ - 我可以使用模板作为多态处理数组的安全解决方案吗?

标签 c++ polymorphism

众所周知,以多态方式处理数组的项目是危险的,因为通常,基类和派生类的大小不同,指针算法很可能会失败。

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/

相关文章:

类内的C++静态常量数组初始化

C++ 多态性 : from parent class to child

c++ - 指向多态类层次结构中派生类型的智能指针,编译错误

Python - wxPython 中的多态性,出了什么问题?

java - java中的多态性

c++ - 在 Qt Creator 中调试应用程序时如何使 Qt 源代码可用?

c++ - 异步显示 Qt 对话框

java - 分层HashMap N阶HMM实现

c++ - 在Qt中如何检查插入的SD卡是否写保护?

c++ - QT 事件透明度仅适用于部分小部件