我可以判断在 C++ 中转换为父 class 的对象类型是否最初是子 class 吗?

Can I tell if an object type casted into a parent class was originally the child class In C++?

假设我有 class 动物,还有另一个 class 狗,它继承自动物。如果我将 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。理想情况下,会有一些尝试将 Animal 转换为 Dog 的操作,但如果无法将对象转换为 Dog,则 returns false。

也许这里需要注意的是,对于我的应用程序,我无法控制 Dog 和 Animal 的细节,并且类型转换发生在我未编写的代码中,因此我没有看到明显的解决方案仿制药。似乎这种事情很常见,所以我可能在这里遗漏了一些简单的东西。有什么建议吗?

编辑:答案的其余部分一般适用。但由于您无法控制 AnimalDog,您可以使用 dynamic_cast。这仍然需要 Animal 是多态的。

bool Owner::takeOnWalk(Animal* animalIn) {
  If (dynamic_cast<Dog*>(animalIn)) {return true};
  return false;
}

REST:您可以从 polymorphic objects using a combination of typeid, std::type_info and 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();}
};