Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 涉及多态性的非常奇怪的错误?_C++_Oop - Fatal编程技术网

C++ 涉及多态性的非常奇怪的错误?

C++ 涉及多态性的非常奇怪的错误?,c++,oop,C++,Oop,我有一个类,我们叫它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 {

我有一个类,我们叫它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以外的任何索引,它会因segfault(EXC_BAD_ACCESS)崩溃

因此,我尝试了以下方法:

1) 我被调试器用来在另一个func中设置断点。出于某种原因,myArray仅被视为大小为1的数组,其他元素由于某种原因没有显示

2) 但是,如果我将myArray上调用的函数从myFunc更改为其他非虚拟函数,它对所有索引都可以正常工作

知道发生了什么吗

编辑:这是调用另一个函数的方式

B myArray[7];
//Initialize elements
anotherFunc(myArray, 2);
这个数组实际上不是A类型的,它实际上由B或从A派生的另一个类的元素组成

class C {
    private:
           void anotherFunc(A myArray[], int index) {
                myArray[index].myFunc();
           }
}
A myArray[]
(由于它是一个函数参数,因此实际读取的是
A*myArray
),精确地指向
A
对象的数组。数组是同质的,即所有元素必须是同一类型

函数需要一个由
A
对象组成的数组。但是,您的代码提供了一个由
B
对象组成的数组。一旦您访问数组的第一个元素之外的元素,事情就会变成奶油冻,因为
A
B
对象的大小不同。例如,当编译器为
myArray[1]
计算出要访问的内存地址时,它将通过第一个
B
对象的一部分得到一个地址;不是第二个
B
对象的地址


要解决这个问题,你需要让函数接受
B*
,或者使用不同的容器。

我没有拼接数组,整个数组都是B类型的。我添加了一些额外的代码来显示函数是如何被调用的。“…转向奶油冻。”神奇的.M.M给了你正确的答案,但这里有一个实验可能会帮助你理解:试试另一个func(&myArray[2],0)@BenJackson,这有助于解决问题,非常感谢!