如何在运行时指定对象类型[重复]

问题描述 投票:-1回答:2

这个问题在这里已有答案:

关于继承,我想从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,但我仍然没有找到解决方案。谢谢。

c++
2个回答
1
投票

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

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

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


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

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

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