C ++层次结构打印练习

时间:2013-08-11 11:46:43

标签: c++ function hierarchy

我正在学习C ++,我对这个练习有疑问。

#include<iostream>
using namespace std;

class B {
    public:
        int x;
        B(int z=1): x(z) {}
};

class D: public B {
    public:
        int y;
        D(int z=5): B(z-2), y(z) {}
};

void fun(B* a, int size) {
    for(int i=0; i<size; ++i) cout << (*(a+i)).x << " ";
}

int main(){
    fun(new D[4],4); cout << "**1\n";
    B* b = new D[4]; fun(b,4); cout << "**2\n";
    b[0] = D(6); b[1] = D(9); fun(b,4); cout << "**3\n";
    b = new B[4]; b[0] = D(6); b[1] = D(9);
    fun(b,4); cout << "**4\n";
}   

打印:

3 5 3 5 **1
3 5 3 5 **2
4 7 3 5 **3
4 7 1 1 **4

为什么在** 1之前和之前** 2,它打印3 5 3 5?我以为3 3 3 3。 在** 3之前我认为5 7 3 3,之前** 4我认为4 7 3 3。 你能帮我更好地理解为什么会这样打印吗?

提前致谢!

2 个答案:

答案 0 :(得分:3)

不要多态地处理数组。 [1] [2]正如您所观察到的那样,您将获得未定义的行为。幸运的是,您只是看到了错误的结果,但该网页上的代码段显示了崩溃。

答案 1 :(得分:1)

我将从行中解释第一行输出3 5 3 5 ** 1:

fun(new D[4],4); cout << "**1\n";

请注意,方法fun接受B *作为参数,它是D的超类。我们传递D​​对象的数组。

此外,请注意我们在前进到数组中的下一个对象时在方法乐趣中使用指针算术。 B有一个变量(x),D有两个(x和y),所以B是对象D的一半大小。我们的对象是D而不是B(虽然它们被切成B但是它们被存储为D在连续的存储器中 - 阵列),所以我们正在推进一半。结果我们实际上打印了值x(来自B),然后是y(来自D)的值,依此类推。