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

时间:2015-02-10 21:50:07

标签: c++ inheritance casting

假设我有类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。

这里可能有一个重要的注意事项是,对于我的应用程序,我无法控制狗和动物的细节,并且类型转换发生在代码我还没写过,所以我没有看到明显的具有泛型的解决方案。看起来这种事情很常见,所以我在这里可能会遗漏一些简单的东西。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

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

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

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