C++ 为什么赢了';我在物种类中的观点并不指向它的异质类

C++ 为什么赢了';我在物种类中的观点并不指向它的异质类,c++,class,c++11,inheritance,virtual-inheritance,C++,Class,C++11,Inheritance,Virtual Inheritance,我的代码由一个类animal和两个继承动物特性的子类组成——两栖类和鱼类。代码可以编译,但解构器的oorder会从下到上杀死它们,但我希望按照显示函数的顺序从上到下杀死它们- 这是我的密码: #include <iostream> #include <string> #include <vector> using namespace std; class Animal{ public: Animal(string name, string diet,

我的代码由一个类animal和两个继承动物特性的子类组成——两栖类和鱼类。代码可以编译,但解构器的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;
}
#包括
#包括
#包括
使用名称空间std;
类动物{
公众:
动物(字符串名称、字符串饮食、布尔队列)
:名称\物种(名称)、制度(饮食)、队列(队列){

如果(name==“”){cout以下代码表明您将
物种
视为比
动物
更一般的东西:

 Species* animal(&kermit);
 animal->display();
 animal = &nemo;
在这种情况下,您应通过将类定义更改为:

class Animal : Species {
...
};
尽管如此,还是有一些评论:

    因为所有物种都有一个名字,无论是植物还是动物,你可以考虑移动成员<代码>动物::名称物种< /代码>类>代码>物种< /代码>;
  • 物种
    的名称是复数,您有一个向量作为成员,并且当为成员调用相应的操作时,该成员的每个元素都会显示或删除,这一事实倾向于表明物种是
    动物
    的集合。因此,不清楚如何添加元素向你的向量移动
  • 与在聚合中使用原始指针不同,您可以使用shared_ptr。这样您就不需要自己删除ANIAML

没有任何东西继承自类
物种
,因此无法使用赋值技术进行转换

物种
中没有方法将
动物
转换为
物种
,因此没有运气。编译器没有办法将
动物
转换为
物种

看起来
物种
动物
容器。您需要提供一种方法,将
动物
添加到
物种
内的容器中,或将容器公开

你想要这样的东西:

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

你似乎把
两栖动物
当作
物种
的子类来编码。你的代码说它们不是。也许英语单词“物种”的本质让人不清楚它是一个事物的容器还是一个特定的事物,