首先抱歉,如果我选择了错误的标题,但不知道如何命名。
先说代码结构:
//== 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.
};
正如评论中所写,Boo 得到了错误的“x”。我只是想知道这是因为指针“超出范围”还是我设计错误的东西。如何解决这个问题,这样我就可以得到正确的 x (C::ob2 的一个)。
抱歉有点奇怪的类名等,但原始代码要长得多,所以我试图只展示这种情况。
@edit 忘了在 Foo() 中添加它,它返回我所期望的 - C::ob2 的 x。