c – 涉及多态的非常奇怪的错误?

我有一个类,我们称它为A.它有一个名为myFunc的虚函数.

class A {
    public:
          virtual void myFunc(){}
}

然后我有一个派生类,称之为B.

class B: public A {
   public:
          void myFunc() {//does stuff}
}

然后我在另一个名为C的类中有一个函数,它接受一个A的数组.这个数组实际上不是A类,它实际上由B或从A派生的另一个类的元素组成.

class C {
    private:
           void anotherFunc(A myArray[],int index) {
                myArray[index].myFunc();
           }
}

我本质上希望调用myFunc,除了由myArray实际派生的类实现的版本,而不是由A实现的版本.

如果索引为0,这可以正常工作.但由于某种原因,如果它是0以外的任何索引,它会崩溃并出现段错误(EXC_BAD_ACCESS).

所以我尝试了以下方法

1)我使用调试器在anotherFunc中设置断点.出于某种原因,myArray仅被视为大小为1的数组,其他元素由于某种原因不会出现.

2)但是如果我将myArray上调用函数从myFunc更改为非虚拟的其他函数,它适用于所有索引…

知道发生了什么事吗?

编辑:这是调用anotherFunc的方式.

B myArray[7];
//Initialize elements
anotherFunc(myArray,2);

解决方法

This array actually is not of type A,it actually consists of elements of either B or another class derived from A.

myArray [](实际上读取A * myArray,因为它是一个函数参数),指向一个A对象的数组.阵列是同质的,即所有元素必须是相同类型的.

您的函数期望一个由A对象组成的数组.但是,您的代码提供了一个由B对象组成的数组.一旦访问超出数组的第一个元素,事情就会变成蛋羹,因为A和B对象具有不同的大小.例如,当编译器计算出用于访问myArray [1]的内存地址时,它将通过第一个B对象的部分地址结束;不是第二个B对象的地址.

解决此问题,您需要使函数接受B *,或使用不同的容器.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...