假设我有以下
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中填充数组“planes”(使用ChildA或childB,即非混合类型)并进行一些计算。
我是否必须在初始化期间使用指针,或者更好地使用模板?我几乎可以肯定模板的使用是不必要的,因为我想限制只使用父类的子项。
答案 0 :(得分:5)
vector<Parent> planes;
没有意义,因为Parent
不可能存在。这是一个抽象类。你可以有一个指针向量,或者更好的是智能指针。
即使Parent
不是抽象的,Parent
对象的向量也会受到对象切片的影响,并且它可能不是您想要的,因为它会破坏多态性。
class UtilClass {
public:
vector<Parent*> planes;
void compute() {
Parent& p = *planes[0];
}
}
答案 1 :(得分:2)
你不能拥有
vector<Parent> planes;
因为您的Parent类是抽象的,无法实例化。你需要使用像
这样的东西 vector<Parent*> planes;
相反,如果你想通过用这种语法创建派生类对象来获得从Parent派生的对象向量
Parent* pNewObject = new ChildB;
planes.push_back(pNewObject)