如何通过最派生的类型比较两个指向对象的指针?

时间:2009-10-11 07:26:00

标签: c++ virtual function-pointers

我有以下类层次结构:

class Base{
....
virtual bool equal(Base *);
}

class Derived1: public Base{
....
virtual bool equal(Base *);
}
class Derived2: public Derived1{
}
class Derived3: public Derived1{
}
class Derived4: public Base{
}

我应该如何编写Base :: equal(Base *)函数,以便比较Derived4和类似的类别?它们没有数据字段,因此请仅检查实际对象是否具有相同的派生类。

如何编写Derived1 :: equal(Base) - Derived2和Derived3类似,它们没有任何数据字段,应该通过Derived1中的数据字段进行比较并检查 对象来自同一派生类?

更新: 我想要这个,因为我不想为每个Derived类编写相同的函数,例如:

bool Derived::equal(Base *b){ 
  Derived *d = dynamic_cast<Derived*>(b); 
  return d; 
} 

2 个答案:

答案 0 :(得分:3)

可用于多态类型间比较的通用技术称为“double dipatch”(参见Double Dispatch)。它可以应用于你的特定问题,在这种情况下,你最终会得到一堆带有几乎空体的重载函数,只返回'false'或'true'。

当然,如果您只想比较动态类型而不是其他内容,您可以通过运行时类型信息(即使用'typeid')来完成。

答案 1 :(得分:2)

我认为你可以在这里使用typeid运算符。你可以这样做:

typeid(*pointerBase) == typeid(*this);

但你为什么要做这样的事呢?它看起来很可疑,我建议重新审视设计。