我遇到的问题与此处提出的问题非常相似: Using derived methods that aren't in the base class
在那个问题中,由IdeaHat提供的最佳答案是使用dynamic_cast,但他/她继续说,如果你不得不诉诸于此,那么你的设计是糟糕的。我在其他问题中发现了非常相似的答案。
那么,在这种情况下,适当的设计是什么?为了便于讨论,请使用此代码:
enum AnimalType {
dog = 0,
cat
}
Class Animal {
virtual AnimalType getType() = 0;
void eat() {
cout << "Ate some food!" << endl;
}
void sleep() {
cout << "Zzzz..." << endl;
}
};
Class Dog : public Animal {
AnimalType getType() {
return AnimalType::dog;
}
void fetch() {
cout << "Fetched the stick!" << endl;
}
};
Class Cat : public Animal {
AnimalType getType() {
return AnimalType::cat;
}
};
//A factory function
Animal* shelter(AnimalType type) {
if(type == AnimalType::dog) {
return new Dog;
}
else {
return new Cat;
}
int main() {
Animal* pet = shelter(AnimalType::dog);
pet->fetch();
}
基本上,我有一个工厂生产特定类的多个子类。一些子类包含父/其他子类中不存在的函数,如果没有解决方法,这将阻止使用多态。
我如何以一种有效的方式实现这一点,并且也会被认为是好的设计&#34;?
答案 0 :(得分:1)
易:
void functionTakingAnimal(Animal& a) {
a.eat();
a.sleep();
}
int main() {
Dog pet;
pet.fetch();
functionTakingAnimal(pet);
}
请勿在您需要之前销毁静态类型信息。