所以我有这个代码:
bool array::InputArray(const ObjectPtr& obj) {
if(full()) return false;
if(!duplicate(vet)) throw exception("\nImportant exception");
obj->input(cin);
arr[nelem]=obj;
nelem++;
return true;
}
obj->input(cin)
只是一个多态函数,允许从控制台输入确切的派生类,主程序给出正确的对象,使虚拟函数不是问题,但arr[nelem]=obj;
,也是“arr”定义如下:
object* arr;
我的目标是:我希望这个数组在主程序中给出时包含正确的对象,但它只包含基类类..如何告诉编译器甚至插入派生方?谢谢!
您的代码在obj
的类型和arr
的类型之间非常一致。然而,根据症状,你的问题是由于object slicing:
arr[nelem]=obj;
因为,根据你对arr
的定义,arr[nelem]
将是object
类型,这是基类。因此无论obj
的实际派生类型如何,它都将被转换回基类(因此使用基类的虚函数)。
如果你想拥有一个多态容器,你需要有一个指针容器,或者更好的智能指针。而不是数组,你应该考虑使用向量:
std::vector<std::shared_ptr<Object>> arr;
bool array::InputArray(std::shared_ptr<Object> obj) {
...
obj->input(cin);
arr.push_back(obj); // no need for nelem. Use arr.size() instead
return true;
}