如何知道两个对象是否来自同一个基类?

时间:2012-04-19 20:43:25

标签: c++

例如:

class Base{...};

class Sub1 : public Base{...};

class Sub2 : public Base{...};

Sub1 s1;
Sub2 s2;

bool is_same_base(void *obj1, void *obj2){
...
}

if(is_same_base(s1,s2){
     printf("Great! S1 and S2 and from same base class!\n");
}

在这种情况下,我不确定知道obj1和obj2是否派生相同基类的最好/最快方法是什么?

一种可能但最慢的方法是逐个比较虚拟表条目,如果两个虚拟表中都存在任何函数指针,那么我可以说它们是从相同的基类派生的。这效率不高。

有任何评论吗?

1 个答案:

答案 0 :(得分:3)

你必须知道基类。如果不知道要动态转换为什么类型,则无法使用动态强制转换。还有typeid,但同样,它不会给你基类。

以下是我看到它的方式:

  1. 为了使用Sub1和Sub2的实例,您需要包含“Sub1.h”和“Sub2.h”(假设它们未在同一文件中声明)。
  2. Sub1.h和Sub2.h需要提及哪个基类Sub1和Sub2继承,否则代码将无法编译。
  3. 换句话说,你无法阻止你自己简单地查找公共基类,所以我不明白为什么你需要首先做这个。

    编辑:你不能使用void指针,因为那样你就丢掉了类型信息。你可以做这种事情的唯一方法是在编译时,使用模板元编程(我可能是错的),但是你的类需要在编写时考虑到这种用法。从我所知,看起来修改原始类代码似乎不是一种选择。