c++ - 类数组求和、索引和计算

标签 c++ oop inheritance indexing

代码:

class B {
public:
    B () : b(++bCounter) {}
    int b;
    static int bCounter;
};

int B::bCounter = 0;

class D : public B {
public:
    D () : d(0) {}
    int d;
};

const int N = 10;
B arrB[N];
D arrD[N];



int sum1 (B* arr) {
    int s = 0;
    for (int i=0; i<N; i++) 
    {
        s+=arr[i].b;
    }
    return s;
}
int sum2 (D* arr) {
    int s = 0;
    for (int i=0; i<N; i++)
    {
        s+=arr[i].b+arr[i].d;
    }
    return s;
}

问题:

这些返回什么:

1) sum1(arrB)=?

2) sum1(arrD)=?

3) sum2(arrD)=?

当我编译并运行这些时,我得到 55、65 和 155,但不知道为什么。我收集到在 arrB 中变量是 b=1,2,3,...,10,在 arrD 中 b=11,12,...,20,所以我会回答 sum1(arrB)=55 和sum1(arrD)=155 等于 11+12+..+20 和 sum2(arrD)=155,因为处处 d=0。

我做错了什么?

最佳答案

您正在进行对象切片。 您正在将一个 D* 数组传递给一个接受 B* 数组的函数。 D 最初大于 B

每次执行 s+=arr[i].b; 时,您都在将指针移动 B 的大小,而您需要移动它 按 D 的大小,因此每次迭代后指针不会向前移动一项。

[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
^
|
iteration 0

[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
         ^
         |
      iteration 1

[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
                   ^
                   |
             iteration 2

[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
                            ^
                            |
                          iteration 3

在您的特定情况下发生的情况是,在每次奇数迭代之后,它指向 D 类对象的中间 中的某个位置。这只是因为 D 恰好是 B 的两倍大,否则行为会有所不同。

关于c++ - 类数组求和、索引和计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12259695/

相关文章:

c++ - 如何释放动态大小的结构

c++ - 其构造函数抛出异常的对象的异常处理是否可以接近其基于代码的堆栈创建?

javascript - 在 Javascript OOP 中调用嵌套函数

php - 使用 vfsStream 将文件插入特定目录/节点

javascript - 扩展 TypeScript Map 以限制数据类型

c++ - 作为函数参数的类型不完整?

c++ - 连接 C++ 和 Postgresql

java - 在 java 中的接口(interface)内声明嵌套类有什么不好的吗?

html - HTML 标签可以继承父/封闭标签的类吗?

javascript - 在不覆盖当前函数体的情况下扩展 javascript 函数