#include <iostream>
using namespace std;
class base {
public:
int b;
base() { b = 0; }
void func1() {}
};
class derived : public base {
public:
int d;
derived() { d = 9; }
};
void func(base* bobj) {
for (int i = 0; i < 5; i++, bobj++)
cout << bobj->b;
cout << endl;
}
int main() {
base bobj[5];
func(bobj);
derived dobj[5];
func(dobj);
return 0;
}
输出:
00000
09090
这里当我将派生对象传递给期望基指针的func()时,我输出为09090,但我不明白为什么.. 有人可以解释第二个输出为什么它打印09090 .. ??
答案 0 :(得分:1)
将派生类对象数组作为基类对象数组处理会产生未定义的行为。
具体来说,bobj++
会将指针增加base
的大小,而不是derived
的大小,使其指向对象中间的某个位置,而不是指向下一个对象的中间位置宾语。在您的情况下,它恰好指向第一个对象的d
成员,该成员被误解为第二个对象的b
成员,因此输出中出现意外的9
。但是,如果不明确,你就不能依赖这种行为;原则上,任何事情都可能发生。