为什么我在Species类中的观点不会指向它的异类

时间:2015-04-15 19:10:44

标签: c++ class c++11 inheritance virtual-inheritance

我的代码由一类动物和两个继承动物特征的子类组成 - 两栖动物和鱼类。代码编译但解构器的oorder从下到上杀死它们但我希望它们从上到下被杀死,因为显示功能顺序表明 - 这是我的代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Animal{
public:
    Animal(string name, string diet, bool queue)
        : name_species(name), regime(diet), queue(queue){
            if(name == ""){cout << "Error, name can't be empty!" << endl; }
            else { cout << "A new animal" << endl; }}
    virtual ~Animal(){ cout << "End of animal" << endl; }
    virtual void display()const;
protected:
    string name_species;
    string regime;
    bool queue;
};

void Animal::display() const{
    cout << "I present the species " << name_species << endl;
}

class Fish : public Animal {
public:
    Fish(string name, unsigned int scales, string diet = "Carnivore", bool  queue = true)
        : Animal(name, diet, queue), scales(scales){ cout << "Add a fish" << endl; }
    ~Fish(){ cout << "Fish species " << name_species << " is turned off. " << endl; }
    void display() const override;
private:
    unsigned int scales;
};
void Fish::display() const {
    Animal::display();
    if(queue == true){cout << "I have a tail "; }
    else { cout << "I don't have a tail "; } cout << "and i follow " << regime <<    endl;
    cout << "I have " << scales << " scales" << endl;
}


class Amphibian : public Animal {
public: Amphibian(string name, string diet, unsigned int claws = 4, bool queue = false)
        : Animal(name, diet, queue), claws(claws){ cout << "Add an amphibian" << endl; }
        void affiche() const;
        ~Amphibian(){ cout << "Amphibian species " << name_species << " is turned off. " << endl; }
private:
        unsigned int claws;
};

void Amphibian::display() const {
    Animal::display();
    if(queue == true){ cout << "I have a tail "; }
    else { cout << "I don't have a tail " ; } cout << "and i follow " << regime << endl;
    cout << "I have " << scales << " scales " << endl;
}

class Species {
public:
    virtual void display()const = 0;
    virtual ~Species();
private:
    vector<Animal*> animals;
};

void Species::display()const{
    for(size_t i(0); i < animals.size(); ++i){
        animals[i]->display(); }
}

Species::~Species(){
    for(size_t i(0); i < animals.size(); ++i){
        delete animals[i];
    }
}

int main()
{
    Amphibian kermit("lizard", "insects");
    Fish nemo("dolphin", 6);
    Fish sala("salamander", 4);

    Animal* animal(&kermit);
    animal->display();

    animal = &nemo;
    animal->display();

    return 0;
}

2 个答案:

答案 0 :(得分:0)

以下代码建议您将Species视为比Animal更通用的内容:

 Species* animal(&kermit);
 animal->display();
 animal = &nemo;

在这种情况下,您应通过将类定义更改为:

来确保声明继承
class Animal : Species {
...
};

然而有些评论:

  • 由于所有物种都有名称,无论是植物还是动物,您可以考虑将成员Animal::name_species移至课程Species;
  • Species的名称是复数,你有一个向量作为成员,并且当为成员调用相应的操作时显示或删除该成员的每个元素这一事实然而建议Species是Animals的聚合。然后不清楚如何向向量添加元素。
  • 您可以使用shared_ptr,而不是在聚合中使用原始指针。然后,您不需要自己删除aniamls。

答案 1 :(得分:0)

没有任何内容继承自Species类,因此使用赋值技术无法进行转换。

Species中没有方法可以转换 AnimalSpecies,所以没有运气。编译器没有关于如何将Animal转换为Species的想法。

Species似乎是Animal容器。您需要提供一个方法,将Animal添加到Species内的容器中,或者将容器公开。

你想要这样的东西:

Species s;
s.animals.push_back(&kermit);