C++ C++;-从向量到达派生类变量

C++ C++;-从向量到达派生类变量,c++,inheritance,vector,C++,Inheritance,Vector,我真的很困惑,所以我不得不问这个问题。我试图编写一个应用程序,但我不知道如何获取派生类的变量,这些变量位于基类的向量中。 代码是: class A { public: A() { }; std::vector<A> aVector; void Foo(); } class B : public A { public: B() { }; int j; } void A::Foo() { aVector.push_back( B(

我真的很困惑,所以我不得不问这个问题。我试图编写一个应用程序,但我不知道如何获取派生类的变量,这些变量位于基类的向量中。 代码是:

class A {
public:
    A() { };

    std::vector<A> aVector;

    void Foo();
}

class B : public A {
public:
    B() { };

    int j;
}

void A::Foo() {
    aVector.push_back( B() );

    // Here I would like to reach B::j, but only the members and variables of A comes in
    aVector[0].j; // wrong
    B b = aVector[0];   // no suitable user-defined conversion from "A" to "B" exists
                        // should I use cast? which one?
}
A类{
公众:
A(){};
向量向量向量机;
void Foo();
}
B类:公共A{
公众:
B(){};
int j;
}
void A::Foo(){
aVector.push_back(B());
//这里我想讨论B::j,但只有A的成员和变量进入
aVector[0].j;//错误
B=aVector[0];//不存在从“A”到“B”的合适的用户定义转换
//我应该使用cast吗?哪一个?
}
我目前正在通过应用程序编程学习继承和这类东西,现在我真的被卡住了


我寻找其他问题,但找不到任何解决我问题的方法。如果有,我错过了,那么很抱歉。

这与向量无关。如果
B
源于
A
,则以下代码:

A a;
B b = a;
是一个错误(除非有某种方法可以转换)


这是正确的-您应该能够统一处理向量项。如果这意味着使用向量的代码希望所有项目都是
B
,那么只需创建一个
vector
。如果没有,那么您就没有必要将
A
转换为
B

您需要将
指针存储到
A
,这样新的
B
对象在推入向量时不会被“切片”(请参见说明)

另外,当您想要在基类的指针上使用特定的子方法/变量时,您需要将它转换为适当的类型

std::vector<A*> aVector;
aVector.push_back(new B());
B* b = (B*)aVector[0];
cout << b->j;
// remember to delete the content of aVector

std::vector了解有关强制转换(
C样式
dynamic\u cast
static\u cast
)的更多信息

向量
声明为包含
A
类型的对象,当您将
B
推入向量时,所有
B
-ness都从存储在
向量中的对象中剥离。这就是我们所知道的

当您稍后尝试访问存储在
向量中的对象的
B
元素时,您无法访问,因为它们根本不存在。你没有B对象的
向量
——你有
a对象的
向量


为了解决这个问题,您需要存储
A
对象,而不是通过值,而是通过引用或指针。您不能将引用存储在
向量中,因此这会给您留下指针。

您不应该尝试从基类访问派生类成员。基类应该不知道派生类的实现细节。你所做的不是多态的。换句话说,您的B实例不能像A实例那样工作,因为您没有提供任何虚拟方法,也没有覆盖任何虚拟方法

整个设计和方法都是错误的。A::Foo()应该是一个虚拟方法(甚至可能是抽象方法)。您应该在B::Foo()中完成这项工作


还有一件事,你不应该只持有一个普通的旧a向量。它应该是指向a的指针。所以std::vector。该成员应以字母m作为前缀,以指示它是该类的成员变量。So std::向量mSomething

理想情况下,您应该存储指向
A
的智能指针。想象一下,一个包含数百万个指针的裸向量突然出现异常:虽然我同意,但我认为我们正在远离最初的问题:)谢谢!我接受了这个,因为这给了我一个有效的解决方案。但现在我看到还有很多东西需要学习:)