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

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

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

有什么意见吗?

最佳答案

你必须知道基类。如果不知道要动态转换为哪种类型,则不能使用动态转换。还有typeid ,但同样,这不会给你基类。

这是我的看法:

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

换句话说,无法阻止您自己简单地查找公共(public)基类,所以我不明白为什么您首先需要这样做。

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

关于c++ - 如何知道两个对象是否派生自同一个基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10236428/

相关文章:

c++ - 如何正确重载从基类到继承的转换

c++ - 如何使用 std::copy?不适用于 OSXSierra/CLION/C++11。

c++ - C++ 中的编译时常量

c++ - 读取文件中的 Eof 位

c++ - 将变量放入字符串(arduino)

c++ - 没有公共(public)构造函数的类模板作为另一个类模板的成员

c++ - 使用具有相同名称的(无作用域的)基类枚举初始化派生类枚举

c++ - C++ 中的多态性和虚函数

c++ - 如何为模板的成员类型重载自由函数

c++ - 识别asm中的地址计算insns