首先抱歉,如果我選擇了錯誤的標題,但不知道如何命名它。向量的對象指針和虛擬方法
代碼結構第一:
//== 1st file ==
class A {
private:
int x;
public:
int GetX() { return x; }
};
//== 2nd file ==
class B {
private:
A ob1;
public:
virtual A & GetARef() { return ob1; }
};
class C : public B {
private:
A ob2;
public:
A & GetARef() { return ob2; }
};
class D : public B {
public:
// something else w/e
};
//== 3rd file ==
class E {
private:
std::map <int,C> m;
public:
C* GetCPtr(int idx) { return &m[idx]; }
};
//== 4th file ==
void foo(E & E_Obj) {
std::vector <B*> v;
v.push_back(E_Obj.GetCPtr(0));
v.push_back(/*some pointer to D class*/);
Boo(v); // FORGOT TO ADD IT ! Sorry
};
//== 5th file ==
void Boo(std::vector <B*> & v) {
std::cout << v[0]->GetARef().GetX(); // returns B::ob1 's x instead of C::ob2 's x.
};
正如在評論中寫道,噓得到錯誤的 'X'。我只是想知道是否因爲指針超出了範圍,或者我錯誤地設計了錯誤的東西。如何解決這個問題,所以我可以得到正確的x(C :: ob2的一個)。
對不起,有點奇怪的類名等,但原始代碼更長,所以我試圖只顯示情況。
@edit 在Foo()中忘了添加它,它返回我期望的 - C :: ob2的x。
你傳遞給'Boo'的是什麼? –
如果您擔心超出範圍,您可以嘗試在C的析構函數中添加一些日誌記錄。 – Medinoc
@Medinoc或使用智能ptrs。 – IdeaHat