0

我有一个父类 A 和 2 个派生类 A1 和 A2:

class A {

}

class A1 : public class A {}

class A2 : public class A {}

而在另一个类中,BI 想要保留一个集合,该集合由对象 A1 或 A2 组成。

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

}

有没有办法组合这两个向量,而不是保留 2 个单独的向量 A1s 和 A2s?我考虑过矢量或矢量,但是当 A1s 或 A2s 调整大小(我假设)时,任何一种方式都可能丢失对象。

任何的想法?

4

3 回答 3

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:

class A1 : public class A {};

应该:

class A1 : public A {};
于 2013-01-08T09:51:40.077 回答
0

您可以使用指针向量

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

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

请注意,在这种情况下,您应该设置A类 virtual 的析构函数。如果你不这样做,当你试图删除一个A*对象时,程序就无法猜测真正的类型是什么。

class A {
public:
    virtual ~A() {}    
};
于 2013-01-08T09:54:57.337 回答
0

您可以使用其他人所说的,加上visitor如果您希望仍然能够将底层A指针用作A1or的设计模式A2。访问者模式并不是为此而设计的,但是以这种方式使用它很好。

于 2013-01-08T10:18:19.380 回答