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

Online demo