【发布时间】:2017-11-27 11:12:56
【问题描述】:
我有一个class Base 和 4 个类 A、B、C、D,每个类都派生自 Base。我将指针Base* 传递给一个函数。
我知道我可以使用dynamic_cast 来检查每个单独的子类型。为了找出该指针的类型,我必须使用 4 个不实用的 if 语句。
这可以通过其他更优雅的方式完成吗?
- 或者我应该在每个子类中保存一个
const int变量来指示它的类型,以便简单地调用GetType()? - 或者我应该专注于确保当我有一个存储时 - 例如库存和
A、B、C、D是不同类型的项目 - 项目自己排序(这样当我有 4 个列表时,新项目会将自己放置在正确的列表中,而不是具有管理库存、检查项目类型然后将其放置在正确列表中的功能)?
【问题讨论】:
-
你真的需要投吗?如果您提供虚函数,您可以通过指向基的指针对派生对象执行大多数操作。
-
问题很常见。一直出现。通常人们在基类中放置一个枚举并创建一个成员来识别类型。这很糟糕,因为基类必须了解每个派生类型。这种情况更多地发生在数据对象中,然后是通用接口就足够的功能对象。示例:BaseResponse、CustomerResponse、CustomerFeedBackResponse...其中每个都有更多特定于该类型的数据成员。虽然我不知道更好的方法。我们在 C++ 中没有反射。也许其他人有更好的答案。
-
您可以使用
typeid按派生类型进行索引。 -
@ChristopherPisz 有更好的方法。更好的方法是不要尝试将通用代码(使用接口和基类的代码)降低到特定的代码(处理具体类型的代码)。如果您已经编写了执行动态转换以执行特定类型的特定代码的代码,那么您应该不需要动态转换并且可以直接访问特定类型。如果你不能这样做,你就有架构问题。
-
@ChristopherPisz 顺便说一下,如果你给出了有限数量的基类,而不是枚举,你应该使用
std::variant
标签: c++ inheritance types