ADT和多态性

问题描述 投票:0回答:1

所以我有这个代码:

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;

我的目标是:我希望这个数组在主程序中给出时包含正确的对象,但它只包含基类类..如何告诉编译器甚至插入派生方?谢谢!

c++ polymorphism containers virtual adt
1个回答
0
投票

您的代码在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;
}

Online demo

© www.soinside.com 2019 - 2024. All rights reserved.