ADT 和多态性
ADT and polymorphism
所以我有这个代码:
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)
只是一个多态函数,允许从控制台输入确切的派生 class,主程序给出正确的对象,因此虚函数不是问题,但 arr[nelem]=obj;
也是 "arr" 的定义:
object* arr;
我的目标是:我希望这个数组在主程序中包含正确的对象,但它只包含基 class 边..我如何告诉编译器甚至插入派生的边??谢谢!
您的代码在 obj
类型和 arr
类型之间非常一致。尽管如此,根据症状,您的问题是由于 object slicing:
arr[nelem]=obj;
因为,根据您对 arr
的定义,arr[nelem]
在此处属于 object
类型,即基础 class。因此,无论 obj
的真正派生类型是什么,它都将被转换回基础 class(因此使用基础 class 的虚函数)。
如果你想有一个多态容器,你需要有一个指针容器,或者更好的是,智能指针。而不是数组,你真的应该考虑使用向量:
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;
}
所以我有这个代码:
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)
只是一个多态函数,允许从控制台输入确切的派生 class,主程序给出正确的对象,因此虚函数不是问题,但 arr[nelem]=obj;
也是 "arr" 的定义:
object* arr;
我的目标是:我希望这个数组在主程序中包含正确的对象,但它只包含基 class 边..我如何告诉编译器甚至插入派生的边??谢谢!
您的代码在 obj
类型和 arr
类型之间非常一致。尽管如此,根据症状,您的问题是由于 object slicing:
arr[nelem]=obj;
因为,根据您对 arr
的定义,arr[nelem]
在此处属于 object
类型,即基础 class。因此,无论 obj
的真正派生类型是什么,它都将被转换回基础 class(因此使用基础 class 的虚函数)。
如果你想有一个多态容器,你需要有一个指针容器,或者更好的是,智能指针。而不是数组,你真的应该考虑使用向量:
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;
}