【问题标题】:Explanation for the code of C++ [duplicate]C ++代码说明[重复]
【发布时间】:2013-08-14 09:50:52
【问题描述】:

代码:

#include<iostream.h>
class base
{
   public:
   int bval;
   base(){ bval=0;}
};

class deri:public base
{
   public:
   int dval;
   deri() { dval=1; }
};

void SomeFunc(base *arr,int size)
{
   for(int i=0; i<size; i++,arr++)
       cout<<arr->bval;
   cout<<endl;
}

int main()
{
   base BaseArr[5];
   SomeFunc(BaseArr,5);

   deri DeriArr[5];
   SomeFunc(DeriArr,5);

   return 0;
}

输出:

00000
01010

我不明白为什么输出的第二行是01010。这个程序只是为了学习目的,用Turbo C++实现的。

【问题讨论】:

  • &lt;iostream.h&gt; 不是标准标头。我不认为 Turbo 有合适的 &lt;iostream&gt;,但话又说回来,应该不惜一切代价避免使用 Turbo。
  • @chris 在我们的大学里,他们只遵循 Turbo C。这就是原因。
  • @HimanshuAggarwal 但是你可以免费下载更好的编译器。甚至微软的免费编译器也比这更标准。

标签: c++ class object pointers inheritance


【解决方案1】:

SomeFunc 期待 base 的数组。在 main 的第一次调用中,您传递了一个 base 数组,但在第二次调用中,您传递了一个 deri 数组。 deri 对象大于base 对象,因此在SomeFunc 中的第一个arr++ 之后,您的指针arr 将不再指向base 对象。

base 的内存布局为:[int bval]
deri的内存布局为:[base, int dval]

DeriArr 是 [deri 0, deri 1, deri 2, deri 3, deri 4],所以
[base 0,int dval 0,base 1,int dval 1,base 2,int dval 2,base 3,int dval 3,base 4,int dval 4]
或分解:
[int bval 0,int dval 0,int bval 1,int dval 1,int bval 2,int dval 2,int bval 3,int dval 3,int bval 4,int dval 4]

SomeFunc 以指向数组开头的 arr 开头。这很好,但是 ++arr 不会为一个 dval 对象(一个 int bval 和一个 int dval)前进指针,而只会为一个基础对象(仅一个 int bval)前进。正如您在 ++arr 之后看到的,arr 将指向 [int dval 0, ...]。

【讨论】:

  • 请您说的更准确些。谢谢!我还没有理解“deri 对象大于基本对象”这一行。此外,为什么第二个输出是 01010?
  • @HimanshuAggarwal Werner 仍然正确。您对“deri 对象大于基本对象”有什么困扰?每个基础对象包含一个 int,每个 deri 对象包含两个 int。内存翻倍。但是指向 base 的指针不知道 deri 对象。
  • @Himanshu Aggarwal:我更新了我的答案。我希望这能让你更清楚。
  • @WernerHenze 回答得很好。我确实不知道这种行为。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-06-01
  • 2013-03-04
  • 2012-06-25
  • 2013-09-12
  • 2017-01-23
  • 2014-09-21
  • 2015-01-13
  • 2015-08-16
相关资源
最近更新 更多