我有三個班級:
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()函式中,我創建了一個這樣vector的類Operation:
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;
編譯沒有問題,但是即使pair_routes第1行的值發生變化,它也回傳值0。我嘗試在基類中用不同的值初始化這個成員,每次程式都回傳這個值。
uj5u.com熱心網友回復:
您的派生類正在宣告它們自己的pair_routes成員來隱藏(即隱藏)pair_routes基Operation類的成員。
當您執行op->execute()時,op指向一個OperationR物件,所以它正在呼叫OperationR::execute(),然后修改OperationR::pair_routes資料成員。但是之后,您將顯示Operation::pair_routes未修改的資料成員。
擺脫陰影pair_routes資料成員,您不需要它們。派生類可以訪問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
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/472578.html
上一篇:win32中GUID的庫在哪里
