C++ 对象指针向量和虚方法

C++ 对象指针向量和虚方法,c++,virtual-functions,C++,Virtual Functions,首先,如果我选择了错误的标题,我很抱歉,但我不知道如何命名 代码结构优先: //== 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

首先,如果我选择了错误的标题,我很抱歉,但我不知道如何命名

代码结构优先:

//== 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.
};
/==第一个文件==
甲级{
私人:
int x;
公众:
int GetX(){return x;}
};
//==第二个文件==
B类{
私人:
A ob1;
公众:
虚拟A&GetARef(){return ob1;}
};
丙类:公共乙类{
私人:
ob2;
公众:
A&GetARef(){return ob2;}
};
D类:公共B类{
公众:
//还有别的东西吗
};
//==第三个文件==
E类{
私人:
std::map m;
公众:
C*GetCPtr(intidx){return&m[idx];}
};
//==第四个文件==
void foo(E&E_Obj){
std::向量v;
v、 推回(E_Obj.GetCPtr(0));
v、 向后推(/*指向D类的指针*/);
Boo(v);//忘记添加了!对不起
};
//==第五个文件==
无效Boo(标准::矢量和v){
std::cout GetARef().GetX();//返回B::ob1的x而不是C::ob2的x。
};
正如在评论中所写的,Boo得到了错误的“x”。我只是想知道是指针“超出范围”还是我设计错了什么。如何解决这个问题,这样我就可以得到正确的x(C::ob2的一个)

抱歉,有点奇怪的类名等,但原始代码要长得多,所以我尝试只显示这种情况

@编辑
忘了在Foo()中添加它,它将返回我所期望的-C::ob2的x。

这是您所做工作的本质

#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;
}
#包括
使用名称空间std;
阶级基础{
常数int b=0;
公众:
虚拟常量int&getInt(){
返回b;
}   
};
类重写:公共基{
常数int l=1;
公众:
虚拟常量int&getInt(){
返回l;
}   
};
类叶:公共基{
};
int main(){

cout很抱歉没有在评论中留下回复,但我认为这是值得的。也很抱歉这么晚才回复。我花了一整天的时间慢慢地翻代码,因为你已经证明我的编码很好(除了示例代码中的几个错别字,很抱歉).实际上,在一个字母接一个字母地重写代码之后,我终于找到了一个我通常不会去寻找的麻烦制造者。我的同事在整理一些东西时,切换的不是相关向量中的指针,而是它们的内容

诸如此类

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

修复后,它确实可以正常工作。感谢您的帮助和解决问题。也很抱歉浪费您的时间。

您将传递给
Boo
?如果您担心超出范围,您可以尝试在C的析构函数中添加一些日志。@Medinoc或使用智能PTR。而不是将代码简化为不可编译的snippet(不完整且有拼写错误)对于在StackOverflow上发布,您应该首先在您的计算机上创建一个新项目,烘焙一个,尝试调试它一点,然后发布真正的最小可编译代码(可能您已经通过执行第一部分找到了问题)。请帮助我们帮助您。在简化和更正一些拼写错误后,我没有发现问题:这是正确的答案,因为它结束了问题。您应该接受它(是的,您可以接受自己的答案)。
v[i] = ...