对象指针和虚拟方法传染媒介

时间:2013-09-05 14:45:40

标签: c++ virtual-method

首先对不起,如果我选错了标题,但不确定如何命名。

首先是代码结构:

//== 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。

2 个答案:

答案 0 :(得分:0)

这是你正在做的事情的本质

#include <iostream>

using namespace std;

class Base{
        const int b = 0;
        public:
        virtual const int& getInt(){
                return b;
        }   
};
class LeafOverriding : public Base{
        const int l = 1;
        public:
        virtual const int& getInt(){
                return l;
        }   
};
class Leaf : public Base{
};

int main(){
        cout << Leaf().getInt() << '\t' << LeafOverriding().getInt() << endl;
}

它没有问题(即确实输出0 1)。我会说你的代码片段 - 不编译,顺便说一句 - 并不代表真正的代码。

我很懒,我强迫你用C ++ 11支持编译它,因为const int b = 0const int l = 1:)

答案 1 :(得分:0)

很抱歉没有在评论中留下回复,但我认为值得全程发布。也很抱歉这么晚的回复。我花了一整天的时间在代码中慢慢挖掘,因为你已经证明我的编码很好(除了示例代码中的一些拼写错误,对不起)。实际上在写完一封信后,我终于找到了麻烦制造者,我通常都不会寻找。我的同事在排序某些东西时不是切换相关向量中的指针而是切换它们的内容。

像这样的东西

vector <E*> v;
// ...
*v[i] = ...

而不是

v[i] = ...

在确定之后,它确实像预期的那样工作。感谢您的帮助和清理。也很抱歉浪费你的时间。