C++ c++;父类对象的集合

C++ c++;父类对象的集合,c++,inheritance,collections,vector,C++,Inheritance,Collections,Vector,我有一个父类a和两个派生类A1和A2: class A { } class A1 : public class A {} class A2 : public class A {} 在另一个类B中,我想保留一个集合,它由对象A1或A2组成 class B { vector<A1> _A1s; vector<A2> _A2s; } B类{ 向量A1s; 向量A2s; } 与其保留两个单独的向量A1s和A2s,是否有方法组合这两个向量?我考虑过矢量

我有一个父类a和两个派生类A1和A2:

class A {

}

class A1 : public class A {}

class A2 : public class A {}
在另一个类B中,我想保留一个集合,它由对象A1或A2组成

class B {
    vector<A1> _A1s;
    vector<A2> _A2s;

}
B类{
向量A1s;
向量A2s;
}
与其保留两个单独的向量A1s和A2s,是否有方法组合这两个向量?我考虑过矢量或矢量,但无论哪种方式,当A1s或A2s调整大小时都可能丢失对象(我假设)


有什么想法吗?

您可以使用智能指针向量来创建基类型

std::vector<std::shared_ptr<A>> a_ptr;
用法:

struct B {
public:
  B() {
    a_ptr.push_back(std::shared_ptr<A>(new A1));
    a_ptr.push_back(std::shared_ptr<A>(new A2));
  }

private:
  std::vector<std::shared_ptr<A>> a_ptr;
};

int main(int argc, char* argv[])
{
  B b;
  return 0;
}
应该是:

class A1 : public A {};

您可以使用指向基类型的智能指针向量

std::vector<std::shared_ptr<A>> a_ptr;
用法:

struct B {
public:
  B() {
    a_ptr.push_back(std::shared_ptr<A>(new A1));
    a_ptr.push_back(std::shared_ptr<A>(new A2));
  }

private:
  std::vector<std::shared_ptr<A>> a_ptr;
};

int main(int argc, char* argv[])
{
  B b;
  return 0;
}
应该是:

class A1 : public A {};

可以使用指针的向量

class B {
public:
    std::vector<A*>   _AXs;
};

可以使用指针的向量

class B {
public:
    std::vector<A*>   _AXs;
};

如果您希望仍然能够将底层
a
指针用作
A1
A2
,则可以使用其他人所说的,再加上名为
visitor
的设计模式。visitor模式并不是专门为此设计的,但是这样使用它很好。

您可以使用其他人所说的,如果您希望仍然能够使用底层
指针作为
A1
A2
的话,还可以使用名为
visitor
的设计模式。访问者模式不是为它设计的,但是这样使用它是很好的。

你可能想重新考虑在容器中存储指针到A的优点/缺点,在保持两个单独的向量的同时,认为你应该更多地理解C++中的继承;这个主题对您来说似乎是相当新的,可能您一开始甚至不想要任何继承(初学者倾向于过度使用C++中的继承)。您可能需要重新思考在容器中存储指向A的指针的利/弊,在维护两个独立的向量时,我认为你应该更多地理解C++中的继承性;这个主题对您来说似乎是相当新的,很可能您根本不想要任何继承(初学者倾向于在C++中过度使用继承)。回答得好。但让我补充一点:在将A1/A2和其他实例添加到向量之后,您将不知道哪些元素指向基类或哪个派生类。有一种简单的方法可以找到:向基类及其派生类添加一个虚拟方法,如“std::string getType()”。每个类都返回其标识符字符串。因此,在解释向量时,您可以使用此方法来识别指针后面的内容,并执行例如静态_转换来获得整个instance.right。随着引用计数的增加,对象将不会被删除。我想分享是我追求的。谢谢,我试着在vector中搜索。有没有简单的方法?我知道我可以为向量实现一个运算符==。这个家伙怎么样?你们需要迭代器来访问stl容器,见示例:好答案。但让我补充一点:在将A1/A2和其他实例添加到向量之后,您将不知道哪些元素指向基类或哪个派生类。有一种简单的方法可以找到:向基类及其派生类添加一个虚拟方法,如“std::string getType()”。每个类都返回其标识符字符串。因此,在解释向量时,您可以使用此方法来识别指针后面的内容,并执行例如静态_转换来获得整个instance.right。随着引用计数的增加,对象将不会被删除。我想分享是我追求的。谢谢,我试着在vector中搜索。有没有简单的方法?我知道我可以为向量实现一个运算符==。这家伙怎么样?您需要迭代器来访问stl容器,请参见以下示例: