如何在运行时指定对象类型

时间:2018-01-03 07:39:20

标签: c++

关于继承,我想从Base Class创建具体的对象。 据我所知,Child类可以代表它的父类。考虑以下课程:

class Material{
    public:
    virtual void print(){
        cout << "Base Material Class" << endl;
    }
}

class Wood: public Material{
    public:
    void print(){
        cout << "Wood Material" << endl;
    }
}

class Furniture{
    public:
    void setMaterial(Material material){
        this->material = material;
    }
    virtual void print(){
        this->material.print();
    }
    protected:
        Material material;
}

class Chair: public Furniture{
// further code implements here
}

int main(int argc, char** argv){
     Chair aChair;
     Material material = Wood();
     aChair.setMaterial(material);
     aChair.print(); // -> "Base Material Class"
}

问题是如何在运行时将材料指定为Wood / Steel / etc ...(这在Java中可用,但Cpp不是Java)。你有什么建议吗?我查看了herehere,但我仍然没有找到解决方案。 谢谢。

2 个答案:

答案 0 :(得分:1)

该行:

Material material = Wood();

不允许您使用多态来通过基础访问Wood实例。相反,你只是切掉了部分物体。

要使多态性工作,您需要使用指针或引用。例如:

Material *material = new Wood;

注意:您将要使用某些指针管理类,例如shared_ptrunique_ptr。例如。

std::shared_ptr<Material> = std::make_shared<Wood>();

然后更改setMaterial以获取shared_ptr

void setMaterial(std::shared_ptr<Material>material)
{
  this->material = material;
}

(注意:您还需要更改成员变量的类型)

答案 1 :(得分:1)

您必须使用指针(可能是智能指针)或引用来执行此操作,否则任何参数的派生部分都会被简单地切掉,您剩下的只是基类型的实例。

void setMaterial(std::shared_ptr<Material> material){
        this->material = material;
}
...
std::shared_ptr<Material> material;

请注意,如果您希望能够以这种方式更改材料,则该成员不能作为参考。