在C++中检查基类的两个实例是否属于同一个子类

bra*_*ing 9 c++ dynamic-cast

以下代码解释了问题.填写same_sub_class以检测到虚拟基类A的两个指针实际上是否是同一个具体类.

struct A {
    ...
}:

struct B : public A {
    ...
}:

struct C : public A {
    ...
}


bool same_sub_class(A * a1, A * a2){
    // Fill this in to return true if a1 and a2 are
    // of the same concrete class
}
Run Code Online (Sandbox Code Playgroud)

编辑:

当我查看我的应用程序时,我需要一些与上面略有不同的东西.我需要能够通过type_id对实例进行分组.

仅供参考.我有一个迷你符号algerbra系统,所以要进行操作,有时需要知道类类型进行排序和重新排列表达式很重要.

所以给出了一个指针向量,用于实例说明如何通过type_id对它们进行分组.我要么需要能够散列type_id,要么为每个类生成一个唯一的整数.

Tim*_*tes 19

如果你可以使用RTTI,

typeid(*a1) == typeid(*a2)
Run Code Online (Sandbox Code Playgroud)

我想你也需要

#include <typeinfo>
Run Code Online (Sandbox Code Playgroud)

并且你必须在你的类中有一个虚函数,以便vtable存在 - 析构函数应该没问题.

更新:

我不确定我是否完全理解您对分组的要求(您是否需要某种确定性排序?子子类会发生什么?),但您可以尝试使用从运算符返回的typeid:

  • 哈希从中返回的字符串 typeid(*ptr).name()
  • 使用typeid(*a1).before(typeid(*a2))作为排序标准.但是,这在运行之间没有任何确定性.

通常在考虑RTTI时,最好使用精心设计的虚拟函数(例如双重调度)来查看是否可以更好地完成任何操作.我真的不能说你的情况下是否有一个好的选择,因为我不明白具体细节.

  • @liaK,是的,基类必须至少有一个虚函数. (2认同)

ust*_*sta 8

typeid(*a1) == typeid(*a2)
Run Code Online (Sandbox Code Playgroud)

注意取消引用,这很重要.