假设我有动物课,还有狗类,它是从动物继承的。如果我键入将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的详细信息,并且类型转换发生在我尚未编写的代码中,因此我看不到泛型的明显解决方案。似乎这种事情很普遍,因此我可能在这里错过了一些简单的事情。有什么建议?
编辑:其余的答案通常适用。但是由于您无法控制Animal
and Dog
,因此可以使用dynamic_cast
。这仍然需要Animal
是多态的。
bool Owner::takeOnWalk(Animal* animalIn) {
If (dynamic_cast<Dog*>(animalIn)) {return true};
return false;
}
REST:您可以从搜集这些信息多态对象使用的组合typeid
,std::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();}
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句