如何知道两个对象是否派生自同一基类
How to know whether two objects are derived from same base class?
例如:
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
- 的实例,您需要包含"Sub1.h"和"Sub2.h"(假设它们未在同一文件中声明)。
- Sub1.h 和 Sub2.h 需要提及 Sub1 和 Sub2 继承自哪个基类,否则代码将无法编译。
阻止您自己简单地查找公共基类,所以我不明白为什么首先需要这样做。
编辑:你不能使用void指针,因为那样你无论如何都会丢弃类型信息。你可以做这种事情的唯一方法可能是在编译时,使用模板元编程(我可能是错的),但是你的类需要在编写时考虑到这种用途。据我所知,修改原始类代码似乎不是一种选择。
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 是否可以为 QPixmap 派生类嵌入缩放方法?
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 是否可以使用 using 将基类中的公共成员重新声明为派生类中的私有成员?
- 将基本实例指针强制转换为派生实例指针是否合法?(实例不是派生实例)
- 从模板基类派生是否在派生类声明的点实例化模板
- 是否可以将CRTP与本身已模板化的派生类一起使用
- C++多态性:如何测试一个类是否派生自另一个基类
- 如果所有派生类在编译时都是已知的,那么final关键字是否提供了优化
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- 派生类是单例是否是一种好的做法
- C++ 多态性:如果派生类中的虚函数在基类中声明了常量,是否需要将其声明为常量
- 是否可以从派生类返回基类的实例?
- 基类对象是否隐式添加到派生类中?
- 从不可复制派生 AbstractBaseClasses (ABC) 是否有缺点?
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 是否可以在引用另一个派生类的派生类中声明复制构造函数?
- 继承函数是否适用于 C++ 中的基类元素或派生类元素?
- 如果我只使用指向基类的指针,更改私有派生类是否会影响 ABI?