C++ 为什么赢了';我在物种类中的观点并不指向它的异质类
我的代码由一个类animal和两个继承动物特性的子类组成——两栖类和鱼类。代码可以编译,但解构器的oorder会从下到上杀死它们,但我希望按照显示函数的顺序从上到下杀死它们- 这是我的密码: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,
#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);
你似乎把鱼
和两栖动物
当作物种
的子类来编码。你的代码说它们不是。也许英语单词“物种”的本质让人不清楚它是一个事物的容器还是一个特定的事物,