【问题标题】:C++ hierarchy print exerciseC++层次打印练习
【发布时间】:2013-08-11 11:46:42
【问题描述】:

我正在学习 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。 您能帮我更好地理解为什么会这样打印吗?

提前致谢!

【问题讨论】:

  • 没有像 C/C++ 这样的东西。您的问题显然是 C++,C 没有继承。

标签: c++ function hierarchy


【解决方案1】:

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

【讨论】:

  • 感谢 Chris Jester-Young 和 facthunter 的回答,现在我已经理解了 main() 的前两行。我对 main() 的最后一部分还有另一个问题;例如当我看到: b[0] = D(6); b[1] = D(9);这是什么意思?我将 B 对象(包含在 D 中)放在 b[0] 中,将 D 对象放在 b[1] 中,对吗?然后,使用 b[1] = D(9) 我将 D 中包含的 B 对象放在 b[1] 中,将 D 对象放在 b[2] 中?
  • @RobertoMilani 不,当您执行b[0] = D(6) 时,分配仅复制您的D 对象的B 部分(就像通过调用B::operator=(B const&amp;) 和您的D 对象作为论点),由于切片。 定义明确的,if b 实际上是 B 的数组,而不是 D 的数组。
【解决方案2】:

我将解释输出 3 5 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 存储在连续内存中- 数组),所以我们前进了一半。结果,我们实际上是在打印值 x(来自 B),然后是 y 的值(来自 D)等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多