2017-04-22 66 views
-2

这是我的第一个问题,但对我来说非常重要。 语言:C++,我想用抽象对象列表

#include <list> 

我有抽象类:

  • Organism
  • Animal其继承自Organism
  • Plant其继承自Organism

然后,我有类,如WolfSheep等,他们都来自Animal继承。

最后我有类似Oak,Grass等,他们都从Plant继承。

如何创建包含所有这些元素的列表? list<Organism> my_list; 不起作用。

+3

你尝试过这么远吗?你卡在哪里?展示你的作品! –

+1

你和今晚认识到这件事的所有人明天都会到场。 –

+2

@KerrekSB嘿,别让我这样恐慌!我几乎相信我们是星期天晚上! – Quentin

回答

1

在一个很大的捷径中,你必须使用多态,而你的列表应该包含指向具体对象的基类指针。

例如:

#include <iostream> 
#include <list> 
#include <string> 

using namespace std; 

class Organism 
{ 
    public: 
    virtual string getName() const 
    { 
     cout<<"organism"<<endl; 
     return name; 
    } 
    protected: 
    string name; 
}; 

    class Animal : public Organism 
    { 
     public: 
     virtual string getName() const 
     { 
      cout<<"animal"<<endl; 
      return name; 
     } 
    }; 

class Plant : public Organism 
{ 
    public: 
    virtual string getName() const 
    { 
     cout<<"plant"<<endl; 
     return name; 
    } 
}; 

int main() { 
    list<Organism*> objects; 
    Organism *ob1 = new Animal(); 
    Organism *ob2 = new Plant(); 
    objects.push_back(ob1); 
    objects.push_back(ob2); 
    for(auto it : objects) 
    { 
     it->getName(); 
    } 
    for(auto it : objects) 
    { 
     delete it; 
    } 
    return 0; 
} 
+1

这仅仅是一个例子,你可以使用智能指针或者只需在元素上调用delete。 – mfaferek

+0

您现在添加了代码,以便您的内存得到适当的精益,因此我删除了我的第一条评论。 – sergiol