【发布时间】: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