2015-02-10 30 views
2

假设我有Animal类,而另一类Dog是从Animal继承而来的。如果我输入一个Dog对象作为一个Animal对象,是否有可能在后来知道它最初是一个Dog?我可以告诉,如果一个对象类型转换成父类最初是子类在C++中?

具体而言,这里是我想要做的要点:

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除非据我了解,这些会告诉我它的动物一旦物体被铸造成动物。理想情况下,会有一些操作尝试将动物投射到狗身上,但如果物体不能投射到狗身上则会返回错误。

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

+0

你需要一个虚拟成员在基类('虚拟〜动物(){}'是一个不错的选择)和'dynamic_cast的(animalIn)'(ISA) – 2015-02-10 21:55:21

回答

2

编辑:答案的其余部分一般适用。但由于您无法控制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();} 
}; 
+0

我想'dynamic_cast'是我需要去的方式。在你的例子中,'dynamic_cast (animalIn)'不管'animalIn'是否返回true,因为它是一个指向Animal的指针,指针可以更容易被转换?我需要做些更像'if(dynamic_cast (* animalIn))'吗? – nlupugla 2015-02-11 10:59:09

+0

这是我见过的第一次,给了一个纯虚函数的实现。 – Zebrafish 2016-12-27 01:31:28

相关问题