我能判断投射到父类中的对象类型最初是否是C++中的子类吗
Can I tell if an object type casted into a parent class was originally the child class In C++?
假设我有一个类Animal和另一个类Dog,它继承自Animal。如果我把一个Dog对象输入为Animal对象,以后有可能知道它原来是一只狗吗?
具体来说,以下是我要做的事情的要点:
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中,但如果对象不能投射到Dod中,则返回false。
也许这里需要注意的一点是,对于我的应用程序,我无法控制Dog和Animal的细节,并且类型转换发生在我没有编写的代码中,所以我看不到使用泛型的明显解决方案。这种事情似乎很常见,所以我可能错过了一些简单的东西。有什么建议吗?
EDIT:答案的其余部分一般适用。但由于您无法控制Animal
和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();}
};
相关文章:
- C++LDAP检查用户是否是特定组的成员
- 检查某些类型是否是模板类 std::optional 的实例化
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 如何检查模板专用化是否是基本模板的子类?
- 如何检查变量是否是C++中的地图?
- C++ Chrono 确定一天是否是周末?
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- MFC 中的窗口消息管理:添加基类调用是否是强制性的?
- 检查 n2 是否是 n1 的倍数后结果错误,但根本没有错误
- C ++:检查它是否是类中的数字
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 使用 SET(C++) 检查两个给定字符串是否是字谜时出现运行时错误
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 有没有办法检查发送到变量的值是否是正确的类型,而它已经在该变量下?
- 如何检查一个模板是否是另一个模板的类成员
- 有没有办法检查用户输入是否是数字?
- 如何知道文本文件中的输入是否是 C++ 中的有效数字