关于C ++类的类输出

时间:2016-06-23 09:44:47

标签: c++

我有这段代码:

#include <iostream>
using namespace std;
class test {
public:
    int base;
    test() {
        base = 0;
    }
};
class deri : public test {
public:
    int der;
    deri() {
        der = 1;
    }
};
void foo(test* a, size_t size) {
    for (int i = 0; i != size; i++, a++) {
        cout << (*a).base << endl;;
    }
    cout << endl;
}
int main() {
//  test a[5];
    deri b[5];
//  foo(a, 5);
    foo(b, 5);
    return 0;
}

输出:

0
1
0
1

为什么代码会像评论一样输出?

3 个答案:

答案 0 :(得分:2)

foo 认为你传递了什么,CASE expression WHEN value_1 THEN result_1 WHEN value_2 THEN result_2 ... WHEN value_n THEN result_n ELSE result END select item_number ,case Item_Type_num when 1 then 'Make' when 2 then 'Buy' else 'Undefined end 个实例数组:

test

每个 -------------------------- a --> |base|base|base|base|base| -------------------------- 初始化为base

你实际传递的是一组0个实例:

deri

其中每个 ---------------------------------------------- a --> |base,der|base,der|base,der|base,der|base,der| ---------------------------------------------- 初始化为base,每个0初始化为der

1递增时,函数会增加内存地址,以计算a对象的步幅(因为这是test的类型),它只有一个成员:a。实际上,传递的对象是base,因此有两个成员:deribase。因此,在第一次增量之后,您认为您正在这样做:

der

但实际上你正在这样做:

      --------------------------
      |base|base|base|base|base|
      --------------------------
    a -------^

---------------------------------------------- |base,der|base,der|base,der|base,der|base,der| ---------------------------------------------- a -------^ ,认为它指向第二个a,实际上是指向第一个 test对象的第二个成员。一个小仪器将显示这一点。在我们将数组发送到deri之前打印每个成员的地址,然后显示我们在foo中实际执行的操作:

foo

<强>输出

#include <iostream>
using namespace std;
class test {
public:
    int base;
    test() {
        base = 0;
    }
};

class deri : public test {
public:
    int der;
    deri() {
        der = 1;
    }
};
void foo(test* a, size_t size) {
    for (int i = 0; i != size; i++, a++) {
        cout << (const void*)&(*a).base << ',' << (*a).base << endl;;
    }
    cout << endl;
}
int main()
{
    deri b[5];
    for (auto const& x : b)
        std::cout <<(const void*)&x.base << ',' << (const void*)&x.der << '\n';

    foo(b, 5);
    return 0;
}

请注意,地址将取决于系统,但希望您明白这一点。简而言之,你有一个错误

答案 1 :(得分:1)

你迭代&#34; a&#34; (a ++)。 所以你输入第一个&#34; a&#34; (对于指令从右边开始,所以在++之前的++)并输出它的基数:0 你迭代这个基础并显示它:1 然后你再次迭代&#34; a&#34;并显示其基数:0。 等等...

答案 2 :(得分:1)

据我所知,派生类的大小是测试大小的两倍。我认为在第一次迭代指针a指向对象b [0]和a.base = b [0] .base的求求。然而,在第二次迭代中,指向b [0]的中间点和实数中的a.base是b [0] .der。在第3次迭代中,指向b [1]的乞讨,依此类推。