我们应该使动物类继承自不同类型动物的类,即Dog类将从Carnivore类继承,而Carnivore类将从Mammal类继承。我尝试在自己的主函数中使用班级,它们打印出应该说的内容和名称,但是当我使用老师的主文件运行班级时,它会告诉我其转储堆栈的踪迹。
#include <iostream>
#include <string>
#include <typeinfo>
#include <vector>
using namespace std;
class Mammal {
public:
virtual string say() = 0;
virtual string name() = 0;
};
class Carnivore : public Mammal {
public:
virtual string say() = 0;
virtual string name() = 0;
};
class Canid : public Carnivore{
public:
virtual string say() = 0;
virtual string name() = 0;
};
class Dog : public Canid{
public:
string say(){
return "bark";
}
string name(){
return "dog";
}
};
class Fox : public Canid{
public:
Fox(){
spoke = "ay";
}
std::string say(){
spoke += spoke;
return spoke;
}
std::string name(){
return "fox";
}
private:
std::string spoke;
};
class Feline : public Canid{
public:
virtual string say() = 0;
virtual string name() = 0;
};
class Cat : public Feline{
public:
std::string say(){
return "moew";
}
std::string name(){
return "cat";
}
};
class Rodent : public Mammal{
public:
virtual string say() = 0;
virtual string name() = 0;
};
class Mouse : public Rodent{
public:
std::string say(){
return "squeak";
}
std::string name(){
return "mouse";
}
};
Mammal* MammalFactory(const std::type_info& ti){
if(ti == typeid(Dog)){
cout << "running dog" << endl;
Dog D;
Mammal* dog = &D;
return dog;
}
else if (ti == typeid(Fox)){
cout << "running fox" << endl;
Fox F;
Mammal* fox = &F;
return fox;
}
else if (ti == typeid(Cat)){
cout << "running cat" << endl;
Cat C;
Mammal* cat = &C;
return cat;
}
else if (ti == typeid(Mouse)){
cout << "running mouse" << endl;
Mouse M;
Mammal* mouse = &M;
return mouse;
}
else{
return NULL;
}
}
int main(){
int score = 90;
std::vector<Mammal*> mammals;
mammals.push_back(MammalFactory(typeid(Dog)));
mammals.push_back(MammalFactory(typeid(Cat)));
mammals.push_back(MammalFactory(typeid(Mouse)));
Mammal* fox = MammalFactory(typeid(Fox));
mammals.at(0)->name();
for (std::vector<Mammal*>::iterator I = mammals.begin(); I != mammals.end(); ++I) {
std::cout<<(*I)->name()<<" goes "<<(*I)->say()<<'\n';
}
//Check animal names
if (mammals.at(0)->name() != "dog") {
std::cout<<"Dog's name is incorrect! -10\n";
score -= 10;
}
if (mammals.at(1)->name() != "cat") {
std::cout<<"Cat's name is incorrect! -10\n";
score -= 10;
}
if (mammals.at(2)->name() != "mouse") {
std::cout<<"Mouse's name is incorrect! -10\n";
score -= 10;
}
if (fox->name() != "fox") {
std::cout<<"Fox's name is incorrect! -10\n";
score -= 10;
}
//Fox part
std::string thing1 = fox->say();
std::string thing2 = fox->say();
std::cout<<"What does the "<<fox->name()<<" say?\n";
std::cout<<thing1<<"!\n";
std::cout<<thing1<<"!\n";
std::cout<<thing1<<"!\n";
std::cout<<"What does the "<<fox->name()<<" say?\n";
std::cout<<thing2<<"!\n";
std::cout<<thing2<<"!\n";
std::cout<<thing2<<"!\n";
if (thing1 == thing2) {
std::cout<<"Foxes don't say the same thing twice!\n";
score -= 10;
}
for (std::vector<Mammal*>::iterator I = mammals.begin(); I != mammals.end(); ++I) {
delete *I;
}
delete fox;
return 0;
}
除了析构函数不是虚拟的之外,您还要返回局部变量的地址。这是未定义的行为。
Mammal* MammalFactory(const std::type_info& ti)
{
if(ti == typeid(Dog))
{
cout << "running dog" << endl;
Dog D;
Mammal* dog = &D;
return dog; // so what happens to D when MammalFactory returns?
}
}
对于所有其他派生类,您也会犯同样的错误。该函数返回后,将不再有“ D”。它变得一团雾气,您正在返回该变量不再存在的地址。
要么创建一个新的Mammal(return new Dog;
),要么想出一种创建Dog并返回不属于本地的Dog的方法(同样,问题不仅仅与该类有关,而是所有其他类都将涉及)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句