1

可以说我有以下

class Parent {
  protected: 
    virtual void overrideMe() = 0;
}

class ChildA : public Parent {
  protected: 
    void overrideMe() = 0{}
}

class ChildB : public Parent {
  protected: 
    void overrideMe() = 0{}
}

class UtilClass {
  public:
  vector<Parent> planes;
  void compute() {
    Parent& p = planes[0];
  }
}

在这种情况下,我会在 UtilsClass 中的 compute() 中出现错误,即“父级”无法初始化。

我想做的是在 UtilClass 中填充数组“平面”(使用 ChildA 或 childB,即非混合类型)并进行一些计算。

我必须在初始化期间使用指针,还是更好地使用模板?我几乎可以肯定模板的使用不是必需的,因为我想将使​​用限制在 Parent 类的唯一子级。

4

2 回答 2

5

vector<Parent> planes;没有意义,因为 aParent不存在。这是一个抽象类。您可以拥有一个指针向量,或者更好的是智能指针。

即使Parent不是抽象的,对象的向量Parent也会受到对象切片的影响,这可能不是您想要的,因为它会破坏多态性。

class UtilClass {
  public:
  vector<Parent*> planes;
  void compute() {
    Parent& p = *planes[0];
  }
}
于 2012-07-30T18:11:34.317 回答
2

你不能拥有

  vector<Parent> planes;

因为您的 Parent 类是抽象的,不能被实例化。你需要使用类似的东西

  vector<Parent*> planes;

相反,如果您想通过使用这种语法创建派生类对象来获得从 Parent 派生的对象向量

 Parent* pNewObject = new ChildB;
 planes.push_back(pNewObject)
于 2012-07-30T18:13:02.157 回答