(C )找到基本类型指针的儿童类型

(C++) Finding the child type of a base type pointer

本文关键字:类型 指针      更新时间:2023-10-16

i有一个class Base和4类ABCD,每个类别均来自Base。我将指针Base*传递给功能。

我知道我可以使用dynamic_cast检查每种单独的孩子类型。为了找出该指针是哪种类型,我必须使用4 if语句是不实际的。

这可以以其他更优雅的方式完成吗?

  • 或者我应该在每个子类中保留一个const int变量,以表明其类型为简单呼叫GetType()
  • 或我应该专注于确保有存储空间时 - 例如库存和 ABCD是不同类型的项目 - 项目本身(以便当我有4个列表时,项目将自己放在适当的列表上,而不是拥有管理库存的函数,检查项目的类型,然后将其放在右边的列表中(吗?

还是我应该在每个子类中保存const int变量,以表明其类型为简单呼叫getType((?还是我应该专注于确保当我拥有存储空间时 - 例如库存和a,b,c,d是不同类型的项目 - 项目本身(以便当我有4个列表时,新项目都放置本身在适当的列表上,而不是具有管理库存的函数,检查项目的类型,然后将其放在右边的列表中(?

(

都不是。您应该正确设计基类的接口,因此,当您使用指针到基类的指针时,您不需要知道它是哪种实际类型,只需使用接口即可。由于问题中没有足够的信息,因此很难为您提供更多细节。

注意:直接使用dynamic_cast或具有模拟它的功能(例如,从虚拟函数返回枚举,例如为您提供特定类型(几乎总是设计不当的迹象,尽管有时由于某些技术原因,您有时可能会使用该快捷方式。但是设计您的应用程序并思考如何从开始中检测实际类型 - 肯定是错误的设计方法。

Note2:我以为您正在使用继承和虚拟功能,因此您正在做面向对象的设计。尽管C 是一种多范式语言,您可以解决您的问题不同的方式。例如,您可以将std::variant带有类型ABCD枚举,并使用visitor单独或使用模板功能来单独或一般处理每种类型。但这与OOD不同,在这种情况下,您的课程可能不需要共同的基础。当然,您可以将它们混合在一起,但通常不会导致良好的设计。当您混合不同的范式时,您会从每个范式中获得最差。