我有一个类,我们称它为A.它有一个名为myFunc的虚函数.
class A {
public:
virtual void myFunc(){}
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个派生类,称之为B.
class B: public A {
public:
void myFunc() {//does stuff}
}
Run Code Online (Sandbox Code Playgroud)
然后我在另一个名为C的类中有一个函数,它接受一个A的数组.这个数组实际上不是A类,它实际上由B或从A派生的另一个类的元素组成.
class C {
private:
void anotherFunc(A myArray[], int index) {
myArray[index].myFunc();
}
}
Run Code Online (Sandbox Code Playgroud)
我本质上希望调用myFunc,除了由myArray实际派生的类实现的版本,而不是由A实现的版本.
如果索引为0,这可以正常工作.但由于某种原因,如果它是0以外的任何索引,它会崩溃并出现段错误(EXC_BAD_ACCESS).
所以我尝试了以下方法:
1)我使用调试器在anotherFunc中设置断点.出于某种原因,myArray仅被视为大小为1的数组,其他元素由于某种原因不会出现.
2)但是如果我将myArray上调用的函数从myFunc更改为非虚拟的其他函数,它适用于所有索引...
知道发生了什么事吗?
编辑:这是调用anotherFunc的方式.
B myArray[7];
//Initialize elements
anotherFunc(myArray, 2);
Run Code Online (Sandbox Code Playgroud)
这个数组实际上不是A类,它实际上由B或从A派生的另一个类的元素组成.
A myArray[] (实际读取A *myArray,因为它是一个函数参数),指向一个A对象数组.数组是同类的,即所有元素必须是相同的类型.
您的函数期望一个由A对象组成的数组.但是,您的代码提供由B对象组成的数组.事情会尽快访问超过数组的第一个元素变成奶油,因为A和B对象有不同的尺寸.myArray[1]例如,当编译器计算出要访问的存储器地址时,它将通过第一个B对象的部分地址结束; 不是第二个B对象的地址.
要解决此问题,您需要使函数接受B *,或使用其他容器.
| 归档时间: |
|
| 查看次数: |
49 次 |
| 最近记录: |