如何通过指针识别特定的派生类?
Posted
技术标签:
【中文标题】如何通过指针识别特定的派生类?【英文标题】:How to identify a specific derived class by pointer? 【发布时间】:2018-06-15 12:07:21 【问题描述】:我有一段代码,它由一个引擎、一个由引擎处理的请求指针队列和一组不同类型的请求组成,它们都是类 - 一个“最通用”和很多变种。
现在,其中一种请求类型需要特殊处理。
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 */
将在VerySpecialRequest
上捕获GenericRequest
的实例,仅过滤掉SpecificRequest1
和SpecificRequest2
。
我该如何识别这个特定的孩子?
【问题讨论】:
"GenericRequest
不是抽象的",所以你不能在上面使用dynamic_cast
。使其具有多态性,您就可以做到这一点(虚拟析构函数就足够了)。
@Jarod42 “抽象类”。我不认为这意味着你认为它意味着什么。
@n.m.:来自提供的代码,class GenericRequest ;
-> 没有虚拟方法。
*Right Way To Do Things*™ 是在GenericRequest
中添加一个虚函数,并在VerySpecialRequest
中实现特殊处理。
@Jarod42:可能。好久没学了,大概忘记了。编辑以更清楚我的意思。它确实包含虚拟方法,但不使用它们(最通用的使用模式不需要它们)。
【参考方案1】:
我将对您的示例代码进行最低限度的更改:
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
或SpecificRequest2
,而result
将是一个空指针。
【讨论】:
谢谢。我没有注意到链接问题中的答案实际上从未将指向A
nstance 的指针提供给dynamic_cast<B*>
(也从未实例化A
)所以它实际上根本没有回答我的问题.
@SF.:是的。指针始终是指向多态基类的指针,并且动态转换将其转换为指向子类的指针**如果指针是通过将地址/指针转换为预期类而获得的。我的答案只不过是对另一个的改写......以上是关于如何通过指针识别特定的派生类?的主要内容,如果未能解决你的问题,请参考以下文章