如何知道两个对象是否派生自同一基类

How to know whether two objects are derived from same base class?

本文关键字:派生 是否 基类 对象 两个 何知道      更新时间:2023-10-16

例如:

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 是否派生相同的基类的最佳/快速方法是什么?

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

有什么意见吗?

你必须知道基类。在不知道动态强制转换为哪种类型的情况下,您无法使用动态强制转换。还有typeid,但同样,这不会给你基类。

这是我的看法:

    为了使用 Sub1 和 Sub2
  1. 的实例,您需要包含"Sub1.h"和"Sub2.h"(假设它们未在同一文件中声明)。
  2. Sub1.h 和 Sub2.h 需要提及 Sub1 和 Sub2 继承自哪个基类,否则代码将无法编译。
换句话说,无法

阻止您自己简单地查找公共基类,所以我不明白为什么首先需要这样做。

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

相关文章: