这个问题在这里已有答案:
关于继承,我想从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)。你有什么建议吗?我看了一下here和here,但我仍然没有找到解决方案。谢谢。
您必须使用指针(可能是智能指针)或引用来执行此操作,否则任何参数的派生部分都会被简单地切掉,而您剩下的只是基本类型的实例。
void setMaterial(std::shared_ptr<Material> material){
this->material = material;
}
...
std::shared_ptr<Material> material;
请注意,如果您希望能够以这种方式更改材料,则该成员不能作为参考。
这条线:
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;
}
(注意:您还需要更改成员变量的类型)