我能判断投射到父类中的对象类型最初是否是C++中的子类吗

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

本文关键字:是否是 C++ 子类 类型 对象 父类 判断      更新时间:2023-10-16

假设我有一个类Animal和另一个类Dog,它继承自Animal。如果我把一个Dog对象输入为Animal对象,以后有可能知道它原来是一只狗吗?

具体来说,以下是我要做的事情的要点:

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中,但如果对象不能投射到Dod中,则返回false。

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

EDIT:答案的其余部分一般适用。但由于您无法控制AnimalDog,因此可以使用dynamic_cast。这仍然需要Animal具有多态性。

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

REST:您可以使用typeidstd::type_infostd::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();}
};