假设我有类Animal,还有另一个类Dog,它继承自Animal。如果我输入一个Dog对象作为Animal对象,是否有可能在以后知道它最初是一个Dog?
具体来说,这是我尝试做的事情的要点:
class Animal {};
class Dog: Animal {};
class Owner {
bool takeOnWalk(Animal* animalIn);
};
bool Owner::takeOnWalk(Animal* animalIn) {
If (animalIn->isA(Dog)) {return true}; // what do I use here instead of isA?
return false;
}
int main() {
Dog* fido = new Dog();
Animal* gato = new Animal();
Owner* fred = new Owner();
Owner->takeOnWalk(fido); //I want this to return true
Owner->takeOnWalk(gato); //this should return false
{
我已经尝试了一些像typeof这样的东西,但据我所知,一旦对象被转移到Animal,它们就会告诉我它是动物。理想情况下,会有一些操作尝试将Animal转换为Dog,但如果该对象不能转换为Dog,则返回false。
这里可能有一个重要的注意事项是,对于我的应用程序,我无法控制狗和动物的细节,并且类型转换发生在代码我还没写过,所以我没有看到明显的具有泛型的解决方案。看起来这种事情很常见,所以我在这里可能会遗漏一些简单的东西。有什么建议吗?
答案 0 :(得分:2)
编辑:其余答案一般适用。但由于您无法控制Animal
和Dog
,因此您可以使用dynamic_cast
。这仍然需要Animal
是多态的。
bool Owner::takeOnWalk(Animal* animalIn) {
If (dynamic_cast<Dog*>(animalIn)) {return true};
return false;
}
REST:您可以使用polymorphic objects,typeid
和std::type_info
的组合从std::type_index
收集此信息,具体取决于您希望如何表示它。但这几乎肯定是错误的解决方案。请改用虚拟功能。例如:
class Animal
{
public:
virtual bool WantsToWalk() = 0 {return false;}
virtual ~Animal(){}
};
class Dog: public Animal
{
public:
virtual bool WantsToWalk(){return true;}
};
class Owner {
bool takeOnWalk(Animal* animalIn) {return animalIn->WantsToWalk();}
};