可能是重复问题:
如何在C++中查找对象的类型
我有一个问题,需要检查指针是否符合特定派生类并采取必要措施。
假设我目前有两个派生类DerivedClass1
和DerivedClass2
以及基类BaseClass
。我想检查以下操作。
Ptr<BaseClass> ptr;
if (ptr指向DerivedClass1)
{
action1
}
else
{
action2
}
如何检查ptr指向特定的DerivedClass?
可能是重复问题:
如何在C++中查找对象的类型
我有一个问题,需要检查指针是否符合特定派生类并采取必要措施。
假设我目前有两个派生类DerivedClass1
和DerivedClass2
以及基类BaseClass
。我想检查以下操作。
Ptr<BaseClass> ptr;
if (ptr指向DerivedClass1)
{
action1
}
else
{
action2
}
如何检查ptr指向特定的DerivedClass?
如果您更加面向对象地思考,您可以将其作为基类的虚方法:
Ptr<BaseClass> ptr;
ptr->Action();
并且每个类根据需要实现它。我意识到这不是一个实际的答案,但这是实现您目标的另一种更好的替代方式,这就是我认为值得一提的原因。
BaseClass
是多态的(包含虚函数),你可以进行如下测试:if (dynamic_cast<DerivedClass1*>(ptr.get()))
但通常情况下,您应该像unwind建议的那样使用动态分派,可能是访问者模式,对于这种事情。在您的代码中大量使用dynamic_cast
会使其难以维护。我几乎从不使用dynamic_cast
。
if(dynamic_cast<DerivedClass1*>(ptr))
{
// Points to DerivedClass1
}
else if(dynamic_cast<DerivedClass2*>(ptr)
{
// Points to DerivedClass2
}
DerivedClass1_1
和DerivedClass1_2
,第一个if
语句将把它们都视为DerivedClass1
- 这可能是OP想要的,也可能不是。 - Component 10
*ptr
的动态类型是什么。 - Kerrek SB