我有一个基类和一个派生类。基类内部是一个值,以及一个从成员中减去该值的函数virtual modify(int val)
。此外,派生类重写modify(int val)
,它在调用基类的方法之前进行一些检查。
使用derivedObject.modify(someVal)
中的main()
调用此方法时,一切正常。但是,当我调用调用此modifyAndPrintValue(Base obj)
的函数modify()
时,调用模式正确地命中Derived::modify() => Base::modify()
,但下次打印时,不会修改存储在Base类中的值(这是原始值)。
class Base
{
public:
int value;
void virtual modify(val) {value -= val;}
int getValue() {return value;}
}
class Derived: public Base
{
public:
void modify(val) {Base::modify(val);}
}
void modifyAndPrint(Base obj)
{
obj.modify(5);
cout << obj.getValue(); // should print 9 -5 = 4
}
int main()
{
Derived derivedObj(); //assume this initializes the object with a value, say 10
derivedObj.modify(1);
cout << derivedObj.getValue(); // returns correct value, 9 (10 - 1)
modifyAndPrint(derivedObj); // does not print correct value, still prints 9
}
我做错了什么?
答案 0 :(得分:1)
您正在将Base obj
传递给modifyAndPrint,这意味着您将按值传递 - 这意味着它的副本会被传递给函数。如果您希望函数修改原始值,则必须通过引用,即。 Base &obj
。如需进一步阅读,请参阅Pass by Reference/Value in C++。
答案 1 :(得分:1)
C ++是基于值的:当您不通过指针或引用传递对象时,它们将被复制。该副本将具有由函数声明的静态类型,即,任何派生的部分将被“切片”关闭。您希望通过引用传递对象:
modifyAndPrint(Base& obj) {
...
}