我有这段代码:
#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
为什么代码会像评论一样输出?
答案 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
,因此有两个成员:deri
和base
。因此,在第一次增量之后,您认为您正在这样做:
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]的乞讨,依此类推。