父类对象的c ++集合

时间:2013-01-08 09:49:41

标签: c++ inheritance collections vector

我有一个父类A和2派生类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;

}

有没有办法将这两个向量组合起来,而不是保留2个独立的向量A1s和A2s?我想到了矢量或矢量,但是当A1或A2调整大小时,无论哪种方式都可能丢失对象(我假设)。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

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

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

注意: 您需要将虚拟析构函数添加到A

class A {
public:
  virtual ~A() {}
};

用法:

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;
}

同样,您在课程定义后错过了;,并且在下面的语句中您在A前面有额外的关键字类:

class A1 : public class A {};

应该是:

class A1 : public A {};

答案 1 :(得分:0)

您可以使用指针

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

它将接受A1和A2指针类型。

请注意,在这种情况下,您应该设置A类虚拟的析构函数。 如果不这样做,当您尝试删除A*对象时,程序无法猜出实际类型是什么。

class A {
public:
    virtual ~A() {}    
};

答案 2 :(得分:0)

如果您仍希望能够将基础visitor指针用作AA1,则可以使用其他人所说的内容以及名为A2的设计模式}。访问者模式并非真正为此设计,但以这种方式使用它是很好的。