【问题标题】:Can I tell if an object type casted into a parent class was originally the child class In C++?我可以判断转换为父类的对象类型是否最初是 C++ 中的子类?
【发布时间】:2015-02-10 21:50:06
【问题描述】:

假设我有一个类 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。理想情况下,会有一些操作尝试将 Animal 转换为 Dog,但如果无法将对象转换为 Dog,则返回 false。

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

【问题讨论】:

  • 基类中需要一个虚拟成员(virtual ~Animal() {} 是一个不错的选择)和dynamic_cast<Dog>(animalIn) (isA)

标签: c++ inheritance casting


【解决方案1】:

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

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

REST:您可以使用typeidstd::type_infostd::type_index 的组合从polymorphic objects 收集此信息,具体取决于您希望如何表示它。但这几乎肯定是错误的解决方案。改用虚函数。例如:

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();}
};

【讨论】:

  • 我认为dynamic_cast 是我需要走的路。在您的示例中,无论animalIn 如何,dynamic_cast&lt;Dog*&gt;(animalIn) 都会返回 true,因为它是指向 Animal 的指针,并且可以更轻松地转换指针?我需要做更多类似if (dynamic_cast&lt;Dog&gt;(*animalIn)) 的事情吗?
  • 这是我第一次看到,给一个纯虚函数的实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多