2012-04-19 25 views
1

例如:如何知道两个对象是否从相同的基类派生?

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派生相同的基类的最佳/快呢?

一种可能的最慢的,但方法是比较虚拟表项一个接一个,如果有的话函数指针存在于这两个虚拟表,那么我可以说它们是从相同的基类派生的。这不是有效的。

有何评论?

+0

如果你知道你正在比较哪个基类,你可以使用'dynamic_cast'来解决这个问题 – 2012-04-19 20:46:37

+0

你是否必须使用签名'bool is_same_base(void * obj1,void * obj2)'? – GManNickG 2012-04-19 20:46:49

+3

必要的运行时间还是编译时间? – pmr 2012-04-19 20:47:51

回答

3

你必须知道的基类。如果不知道动态投射到哪种类型,则无法使用动态投射。也有typeid,但同样,这不会给你基类。

这是我看到它的方式:

  1. 为了使用Sub1的和分公司2的情况下,你需要包括“Sub1.h”和“Sub2.h”(假设他们没有申报在同一个文件中)。
  2. Sub1.h和Sub2.h需要提及其中基类SUB1与分公司2从继承,或代码不会编译。

换句话说,有没有办法可以从简单的自己找了公共基类来预防,所以我不明白为什么你需要做这个摆在首位。

编辑:不能使用空指针,因为那时你反正扔掉类型的信息。使用Template metaprogramming(我可能是错误的),编译时你可以做这种事情的唯一方法是,但是你的类需要考虑这种用法。从我所知道的看来,修改原始类代码不是一种选择。

相关问题