c ++将派生类对象传递给期望基类对象的全局函数

时间:2014-08-03 13:59:54

标签: c++ object inheritance constructor argument-passing

#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 .. ??

1 个答案:

答案 0 :(得分:1)

将派生类对象数组作为基类对象数组处理会产生未定义的行为。

具体来说,bobj++会将指针增加base的大小,而不是derived的大小,使其指向对象中间的某个位置,而不是指向下一个对象的中间位置宾语。在您的情况下,它恰好指向第一个对象的d成员,该成员被误解为第二个对象的b成员,因此输出中出现意外的9。但是,如果不明确,你就不能依赖这种行为;原则上,任何事情都可能发生。