向下转换会导致基本成员无法正确修改C ++

时间:2013-12-08 20:51:58

标签: c++

我有一个基类和一个派生类。基类内部是一个值,以及一个从成员中减去该值的函数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
}

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您正在将Base obj传递给modifyAndPrint,这意味着您将按值传递 - 这意味着它的副本会被传递给函数。如果您希望函数修改原始值,则必须通过引用,即。 Base &obj。如需进一步阅读,请参阅Pass by Reference/Value in C++

答案 1 :(得分:1)

C ++是基于值的:当您不通过指针或引用传递对象时,它们将被复制。该副本将具有由函数声明的静态类型,即,任何派生的部分将被“切片”关闭。您希望通过引用传递对象:

modifyAndPrint(Base& obj) {
    ...
}