c++中父类对象的集合

c++ collection of parent class object

本文关键字:集合 对象 父类 c++      更新时间:2023-10-16

我有一个父类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;
}

与其保持两个单独的向量A1s和A2s,是否有一种方法将这两个向量组合起来?我想矢量或矢量,但无论哪种方式都可能丢失对象当A1s或A2s调整大小(我假设)。

任何想法?

你可以使用一个智能指针的向量指向基类型

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

可以使用指针向量

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

同时接受A1和A2类型的指针。

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

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

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