【问题标题】:How to specify object type at run time [duplicate]如何在运行时指定对象类型
【发布时间】:2018-01-03 07:39:19
【问题描述】:

关于继承,我想从基类创建具体的对象。 据我了解, 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)。你有什么建议吗?我查看了here 和here,但我仍然没有找到解决方案。 谢谢。

【问题讨论】:

标签: c++


【解决方案1】:

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

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

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

【讨论】:

  • 引用不起作用的原因是因为程序只能“看到”基类(而不是派生类的其余部分),不是吗?
【解决方案2】:

行:

Material material = Wood();

不允许您使用多态性通过基访问Wood 实例。相反,您只是切掉了对象的一部分。

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

Material *material = new Wood;

注意:您需要使用一些指针管理类,例如shared_ptr 或unique_ptr。例如。

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

然后将setMaterial改成shared_ptr:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2019-06-01
    • 2017-01-01
    • 2018-11-27
    相关资源
    最近更新 更多