我可以判断在 C++ 中转换为父 class 的对象类型是否最初是子 class 吗?
Can I tell if an object type casted into a parent class was originally the child class In C++?
假设我有 class 动物,还有另一个 class 狗,它继承自动物。如果我将 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,则 returns false。
也许这里需要注意的是,对于我的应用程序,我无法控制 Dog 和 Animal 的细节,并且类型转换发生在我未编写的代码中,因此我没有看到明显的解决方案仿制药。似乎这种事情很常见,所以我可能在这里遗漏了一些简单的东西。有什么建议吗?
编辑:答案的其余部分一般适用。但由于您无法控制 Animal
和 Dog
,您可以使用 dynamic_cast
。这仍然需要 Animal
是多态的。
bool Owner::takeOnWalk(Animal* animalIn) {
If (dynamic_cast<Dog*>(animalIn)) {return true};
return false;
}
REST:您可以从 polymorphic objects using a combination of typeid
, std::type_info
and 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();}
};
假设我有 class 动物,还有另一个 class 狗,它继承自动物。如果我将 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,则 returns false。
也许这里需要注意的是,对于我的应用程序,我无法控制 Dog 和 Animal 的细节,并且类型转换发生在我未编写的代码中,因此我没有看到明显的解决方案仿制药。似乎这种事情很常见,所以我可能在这里遗漏了一些简单的东西。有什么建议吗?
编辑:答案的其余部分一般适用。但由于您无法控制 Animal
和 Dog
,您可以使用 dynamic_cast
。这仍然需要 Animal
是多态的。
bool Owner::takeOnWalk(Animal* animalIn) {
If (dynamic_cast<Dog*>(animalIn)) {return true};
return false;
}
REST:您可以从 polymorphic objects using a combination of typeid
, std::type_info
and 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();}
};