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

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 的实例,仅过滤掉SpecificRequest1SpecificRequest2

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

【问题讨论】:

"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,或SpecificRequest1SpecificRequest2,而result 将是一个空指针。

【讨论】:

谢谢。我没有注意到链接问题中的答案实际上从未将指向A nstance 的指针提供给dynamic_cast&lt;B*&gt;(也从未实例化A)所以它实际上根本没有回答我的问题. @SF.:是的。指针始终是指向多态基类的指针,并且动态转换将其转换为指向子类的指针**如果指针是通过将地址/指针转换为预期类而获得的。我的答案只不过是对另一个的改写......

以上是关于如何通过指针识别特定的派生类?的主要内容,如果未能解决你的问题,请参考以下文章

当有多个派生类时,如何使用基类指针访问派生类的函数成员?

通过指向派生类的指针访问派生成员变量

关于C++基类、派生类的引用和指针

指向派生类成员函数的指针,但不是派生(虚拟)函数

为啥我可以通过指向派生对象的基类指针访问派生私有成员函数?

派生类指针如何调用基类函数