检查指针是否指向特定的C++类

11

可能是重复问题:
如何在C++中查找对象的类型

我有一个问题,需要检查指针是否符合特定派生类并采取必要措施。

假设我目前有两个派生类DerivedClass1DerivedClass2以及基类BaseClass。我想检查以下操作。

Ptr<BaseClass> ptr;

if (ptr指向DerivedClass1) { action1 } else { action2 }

如何检查ptr指向特定的DerivedClass?


2
不,很可能你并不想知道 *ptr 的动态类型是什么。 - Kerrek SB
3个回答

22

如果您更加面向对象地思考,您可以将其作为基类的虚方法:

Ptr<BaseClass> ptr;

ptr->Action();

并且每个类根据需要实现它。我意识到这不是一个实际的答案,但这是实现您目标的另一种更好的替代方式,这就是我认为值得一提的原因。


谢谢。这是我的初步想法,但我在一个特定的类中有一个常量方法和另一个非常量方法,因此尝试将此行为添加到新方法中。 - lordlabakdas

15
如果BaseClass是多态的(包含虚函数),你可以进行如下测试:
if (dynamic_cast<DerivedClass1*>(ptr.get()))

但通常情况下,您应该像unwind建议的那样使用动态分派,可能是访问者模式,对于这种事情。在您的代码中大量使用dynamic_cast会使其难以维护。我几乎从不使用dynamic_cast


1
我同意我们大多数情况下应该避免这种做法,但是我需要在测试方法中确认一个对象是否属于某个特定类型。因此有时候也必须使用。谢谢! - Peter

9
if(dynamic_cast<DerivedClass1*>(ptr))
{
  // Points to DerivedClass1
}
else if(dynamic_cast<DerivedClass2*>(ptr)
{
  // Points to DerivedClass2
}

1
如果有第三个级别,比如DerivedClass1_1DerivedClass1_2,第一个if语句将把它们都视为DerivedClass1 - 这可能是OP想要的,也可能不是。 - Component 10
4
@Component10,我只是回答了提问者的问题。我不赞成这种做法,通常只有在出现了“糟糕的设计决策”时才需要这样做。感谢您指出继承情况,以防提问者决定尝试这样做。 - Aesthete

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接