C++分层打印练习 我正在学习C++,我有一个关于这个练习的问题。< /P> #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"; }

C++分层打印练习 我正在学习C++,我有一个关于这个练习的问题。< /P> #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"; },c++,function,hierarchy,C++,Function,Hierarchy,为什么在**1和**2之前打印3 5?我想是3。 在**3之前我想573,在**4之前我想473。 你能帮我更好地理解为什么它是那样打印的吗 提前谢谢 不要以多态方式处理数组。[]正如您所观察到的,您将获得未定义的行为。幸运的是,您只是看到了错误的结果,但该页面上有一个代码片段演示了崩溃。不要以多态方式处理数组。[]正如您所观察到的,您将获得未定义的行为。幸运的是,您只是看到了错误的结果,但该页面上有一个代码片段演示了崩溃。我将从以下行解释输出3 5**1的第一行: fun(new D[4],4

为什么在**1和**2之前打印3 5?我想是3。 在**3之前我想573,在**4之前我想473。 你能帮我更好地理解为什么它是那样打印的吗


提前谢谢

不要以多态方式处理数组。[]正如您所观察到的,您将获得未定义的行为。幸运的是,您只是看到了错误的结果,但该页面上有一个代码片段演示了崩溃。

不要以多态方式处理数组。[]正如您所观察到的,您将获得未定义的行为。幸运的是,您只是看到了错误的结果,但该页面上有一个代码片段演示了崩溃。

我将从以下行解释输出3 5**1的第一行:

fun(new D[4],4); cout << "**1\n";
请注意,方法fun接受B*作为参数,它是D的超类。我们传递的是一个D对象数组


此外,请注意,当前进到数组中的下一个对象时,我们在方法fun中使用指针算法。B有一个变量x和D作为两个变量x和y,所以B是对象D的一半大小。我们的对象是D而不是B,虽然它们被分割成B,但它们作为D存储在连续内存数组中,所以我们前进了一半。因此,我们实际上是从B打印x值,然后从D打印y值,依此类推。

我将从以下行解释输出35**1的第一行:

fun(new D[4],4); cout << "**1\n";
请注意,方法fun接受B*作为参数,它是D的超类。我们传递的是一个D对象数组


此外,请注意,当前进到数组中的下一个对象时,我们在方法fun中使用指针算法。B有一个变量x和D作为两个变量x和y,所以B是对象D的一半大小。我们的对象是D而不是B,虽然它们被分割成B,但它们作为D存储在连续内存数组中,所以我们前进了一半。因此,我们实际上是从B打印x值,然后从D打印y值等等。

没有像C/C++这样的东西。你的问题很清楚,C++,C没有继承,没有C/C++这样的东西。你的问题很明显是C++,C没有继承。谢谢Chris Jester Young和Funthunter的答案,现在我已经理解了我的第一行。我还有一个问题是关于我主要演讲的最后一部分;例如,当我看到:b[0]=D6;b[1]=D9;这是什么意思?我把D中包含的B对象放在B[0]中,把D对象放在B[1]中,对吗?然后,对于b[1]=D9,我将包含在D中的b对象放在b[1]中,将D对象放在b[2]?@RobertoMilani No,当执行b[0]=D6时,由于切片,赋值仅复制D对象的b部分,就好像通过调用b::operator=b const&将D对象作为参数一样。这是一个很好的定义,如果b实际上是b的数组而不是D的数组。感谢Chris Jester Young和facthunter的回答,现在我已经理解了我主要内容的前两行。我还有一个问题是关于我主要演讲的最后一部分;例如,当我看到:b[0]=D6;b[1]=D9;这是什么意思?我把D中包含的B对象放在B[0]中,把D对象放在B[1]中,对吗?然后,对于b[1]=D9,我将包含在D中的b对象放在b[1]中,将D对象放在b[2]?@RobertoMilani No,当执行b[0]=D6时,由于切片,赋值仅复制D对象的b部分,就好像通过调用b::operator=b const&将D对象作为参数一样。如果b实际上是b的数组而不是D的数组,那么这是定义良好的。