我有一段代码,包括一个引擎,一个由引擎处理的请求指针队列,以及一组不同类型的请求,所有这些类都是 - 一个“最通用”和很多变体。
现在,其中一种请求类型需要特殊处理。
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
的实例,仅过滤SpecificRequest1
和SpecificRequest2
。
我该如何识别这个特定的孩子?
答案 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
指向该对象,或指向非派生GenericResult
或SpecificRequest1
或<{1}},SpecificRequest2
将是一个空指针。