2012-08-14 78 views
5

可能重复:
Finding the type of an object in C++检查,如果指针指向一个特定的类C++

我有检查指针,看看他们是否符合特定的派生类,并采取一个问题必要的行动。

可以说我目前有2个派生类DerivedClass1DerivedClass2和基类BaseClass。我想检查以下操作。

Ptr<BaseClass> ptr;

if (ptr points to DerivedClass1) { 动作1 } 其他 { 动作2 }

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

+2

不,很可能你*不想*知道'* ptr'的动态类型是什么。 – 2012-08-14 11:17:59

回答

10

如果BaseClass是多态(包含虚拟函数),你可以测试:

if (dynamic_cast<DerivedClass1*>(ptr.get())) 

但通常为开卷暗示,可能是访问者模式,对于这样的事情,你应该使用动态调度。乱抛垃圾代码dynamic_cast使其难以维护。我几乎从不使用dynamic_cast

20

如果你想多一点的对象orientedly,你只是使它在基类中的虚方法:

Ptr<BaseClass> ptr; 

ptr->Action(); 

并且将每个类实现它需要。我意识到这不是一个真正的答案,但它是实现你的目标的另一种方式,通常认为它更好,这就是为什么我认为这是值得一提的原因。

+0

谢谢。这是我最初的想法,但我遇到了在特定类中使用const方法而在另一个类中使用非const的问题,因此试图在新方法中添加此行为。 – lordlabakdas 2012-08-14 11:27:45

4
if(dynamic_cast<DerivedClass1*>(ptr)) 
{ 
    // Points to DerivedClass1 
} 
else if(dynamic_cast<DerivedClass2*>(ptr) 
{ 
    // Pointes to DerivedClass2 
} 
+0

如果有第三层次,比如说DerivedClass1_1和DerivedClass1_2,那么第一个if语句会把它们当作DerivedClass1来处理 - 这可能或不可能是OP想要的。 – 2012-08-14 11:40:36

+0

@ Component10我简单回答了OP的问题。我不会宽恕这种做法,并且通常会发现这只是在_bad设计决定制定时才需要。感谢您指出继承情况,以防OP决定尝试这样的事情。 – Aesthete 2012-08-14 11:45:36