如何改变一个基class的成员的值?

How can change the value of a member of a base class?

我有三个 classes:

class Operation{
public:
    virtual bool execute(const Solution& sol, Solution& newSol) = 0;
    pair<int, int> pair_routes;
};

class OperationR : public Operation{
public:
    OperationR(){};
    bool execute(const Solution& sol, Solution& newSol);
    pair<int, int> pair_routes;
};

class OperationD : public Operation{
public:
    OperationD(){};
    bool execute(const Solution& sol, Solution& newSol);
    pair<int, int> pair_routes;
};

pair_routes 的值在 execute() 函数内部改变。

main() 函数中,我创建了 class Operationvector,如下所示:

vector<Operation*> operations;
    
OperationR* opr = new OperationR();
operations.push_back(opr);
    
OperationD* opd = new OperationD();
operations.push_back(opd);
    
Operation* op = operations[0];
Solution s1, s2;
op->execute(s1, s2);   // line 1
    
cout << op->pair_routes.first;

编译没有问题,但是即使第1行pair_routes的值发生变化,它returns值为0。我尝试在base [=中初始化这个成员27=]有不同的值,每次程序returns这个值。

您派生的 classes 正在声明它们自己的 pair_routes 成员 shadow(即隐藏)基的 pair_routes 成员Operation class.

当您执行 op->execute() 时,op 指向一个 OperationR 对象,因此它调用 OperationR::execute(),然后修改 OperationR::pair_routes数据成员。但是之后,您将显示 Operation::pair_routes 数据成员,该成员未被修改。

摆脱阴影 pair_routes 数据成员,您不需要它们。派生的 classes 可以访问基础 class.

pair_routes 数据成员
class Operation{
public:
    virtual bool execute(const Solution& sol, Solution& newSol) = 0;
    pair<int, int> pair_routes;
};

class OperationR : public Operation{
public:
    OperationR() = default;
    bool execute(const Solution& sol, Solution& newSol) override;
    //pair<int, int> pair_routes; // <-- get rid of this
};

class OperationD : public Operation{
public:
    OperationD() = default;
    bool execute(const Solution& sol, Solution& newSol) override;
    //pair<int, int> pair_routes; // <-- get rid of this
};