我的代码由一类动物和两个继承动物特征的子类组成 - 两栖动物和鱼类。代码编译但解构器的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;
}
答案 0 :(得分:0)
以下代码建议您将Species
视为比Animal
更通用的内容:
Species* animal(&kermit);
animal->display();
animal = &nemo;
在这种情况下,您应通过将类定义更改为:
来确保声明继承class Animal : Species {
...
};
然而有些评论:
Animal::name_species
移至课程Species
; Species
的名称是复数,你有一个向量作为成员,并且当为成员调用相应的操作时显示或删除该成员的每个元素这一事实然而建议Species是Animals
的聚合。然后不清楚如何向向量添加元素。 答案 1 :(得分:0)
没有任何内容继承自Species
类,因此使用赋值技术无法进行转换。
Species
中没有方法可以转换 Animal
到Species
,所以没有运气。编译器没有关于如何将Animal
转换为Species
的想法。
Species
似乎是Animal
的容器。您需要提供一个方法,将Animal
添加到Species
内的容器中,或者将容器公开。
你想要这样的东西:
Species s;
s.animals.push_back(&kermit);