【问题标题】:c++ passing derived class object to global function where base class object is expectedc ++将派生类对象传递给需要基类对象的全局函数
【发布时间】:2014-09-26 03:26:54
【问题描述】:
#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..??

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢您的清晰解释。但是当我们说“bobj->b”时我仍然有疑问,它不会在同一个内存位置搜索值“b”..??为什么只打印该内存位置的值而不检查它是“b”还是“d”......??
    • @user3440508:是的,如果bobj 指向有效的base 对象,它会在内存位置查找b。但是由于它没有指向一个有效的对象(因为它被错误地调整了),它会找到别的东西。没有“检查”;程序假定指针是有效的,如果不是则失败(给出未定义的行为)。
    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多