如何通过指针识别特定的派生类?

时间:2018-06-15 12:07:22

标签: c++ class pointers inheritance

我有一段代码,包括一个引擎,一个由引擎处理的请求指针队列,以及一组不同类型的请求,所有这些类都是 - 一个“最通用”和很多变体。

现在,其中一种请求类型需要特殊处理。

class GenericRequest {};
class SpecificRequest1 : public GenericRequest {};
class SpecificRequest2 : public GenericRequest {};
class VerySpecialRequest : public GenericRequest {};

队列只包含指向实例的指针(类型为GenericRequest*)。 GenericRequest也被实例化 - 它的实例也出现在队列中。

我需要引擎单挑VerySpecialRequest并执行额外的操作。

如果我理解How to identify failed casts using dynamic_cast operator?中涉及继承的答案,在我的情况下使用:

VerySpecialRequest* result = dynamic_cast<VerySpecialRequest*>( queue_entry );

if(result != NULL) { /* process the special entry */ }

将在GenericRequest上方捕获VerySpecialRequest的实例,仅过滤SpecificRequest1SpecificRequest2

我该如何识别这个特定的孩子?

1 个答案:

答案 0 :(得分:2)

我将最低限度地更改您的示例代码:

class GenericRequest {
   virtual ~GenericRequest;          // the virtual destructor makes GenericRequest polymorphic
};
class SpecificRequest1 : public GenericRequest {};
class SpecificRequest2 : public GenericRequest {};
class VerySpecialRequest : public GenericRequest {};

一旦GenericRequest包含一个虚函数,它就会变成一个多态类,成为它的所有子类。

一旦确保了多态性,我们就可以安全地使用dynamic_cast

GenericResult *queue_entry;
...
VerySpecialRequest* result = dynamic_cast<VerySpecialRequest*>( queue_entry );
if(result != NULL) { /* process the special entry */ }

这就是全部。 queue_entry实际指向VerySpecialRequest对象,result指向该对象,或指向非派生GenericResultSpecificRequest1或<{1}},SpecificRequest2将是一个空指针。