在C ++中继承Parents成员变量?

时间:2015-12-08 02:38:52

标签: c++ inheritance

为什么此功能打印4198400?我的理解是,由于Bar是Foo的孩子,它也有成员变量“a”,并且因为changeA(b)将a设置为6,所以它应该打印6.

#include <iostream>
using namespace std;

class Foo {
public:
    int a;
};
class Bar: public Foo {
public:
    int b;
};
Foo changeA(Foo f) {
    f.a = 6;
    return f;
}
int main() {
    Bar b;
    changeA(b);
    cout << b.a << endl;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

你似乎对此很新,所以我会试着看看能不能解释一下。可行的固定代码如下所示:

CHAR

你正在做的事情的问题是,当你将b传递给该函数时,它会传递它的副本。而您想要修改原始对象本身。为了详细说明,创建了一个b的副本并将其传递给该函数,该函数修改它并返回它。所以,如果你要做一个

#include <iostream>
using namespace std;

class Foo {
public:
    int a;
};
class Bar: public Foo {
public:
    int b;
};
Foo *changeA(Foo *f) {
    f->a = 6;
    return f;
}
int main() {
    Bar *b = new Bar();
    changeA(b);
    cout << b->a << endl;
    return 0;
}

a将具有您想要的修改值。但原始物体将保持不变。

当您将其作为指针传递时,您在changeA函数中所做的更改也将应用于原始b。使用引用(&amp;)也可以实现同样的目的,这将更容易:

Foo a = changeA(b);

在这里,你实际上做了一个改变,它将起作用,&符号的作用是确保你不创建副本并将其传递给函数,而是传递对象本身。所以这样,所有更改都是对原始对象本身进行的。

答案 1 :(得分:0)

如果您需要更改Bar b内部changeA功能的值,您可以做两件事

  1. 通过引用将现有实例(b)传递给changeA函数,并要求函数更改同一实例。

    Foo changeA(Foo& f) { f.a = 6; } int main() { Bar b; changeA(b);
    return 0; }

  2. 按值将现有实例传递给changeA ,并要求函数返回已更改的实例。在这里,您必须将返回值保存在新实例中。

    Foo changeA(Foo f) { f.a = 6; return f; } int main() { Bar b; Foo c = changeA(b); cout << c.a << endl;
    return 0; }

  3. 但是,我喜欢第一种方式,因为它避免了创建额外的实例。