(C ++)查找基类型指针的子类型

时间:2017-06-23 19:34:57

标签: c++ inheritance types

我有一个class Base和4个班ABCD,每个都来自Base。我将指针Base*传递给函数。

我知道我可以使用dynamic_cast检查每个单独的子类型。为了找出指针的类型,我必须使用4个if语句,这些语句并不实用。

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

  • 或者我应该在每个子类中保留一个const int变量来指示其类型为简单调用GetType()
  • 或者我应该专注于确保在我有存储空间时 - 例如广告资源和ABCD是不同类型的项目 - 项目自行排序(这样当我有4个列表时,新项目将自己置于正确的列表中,而不是具有管理库存的功能,检查项目的类型,然后将其放在正确的列表中)?

1 个答案:

答案 0 :(得分:2)

  

或者我应该在每个子类中保持一个const int变量来指示其类型为简单调用GetType()?或者我应该专注于确保当我有存储时 - 例如库存和A,B,C,D是不同类型的项目 - 项目自行排序(这样当我有4个列表时,新项目将放置它本身在正确的列表上,而不是管理库存的功能,检查项目的类型,然后将其放在正确的列表上)?

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

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

注2:由于使用了继承和虚函数,我假设您正在进行面向对象的设计。虽然C ++是一种多范式语言,但您可以通过不同方式解决问题。例如,您可以std::variant ABCD枚举,并使用visitor单独处理每种类型或通常使用模板功能。但这是与OOD不同的方法,在这种情况下,您的类可能根本不需要共同基础。当然你可以将它们混合在一起,但通常不会导致良好的设计。当你混合使用不同的范例时,你会从每个范例中得到最差的结果。