【问题标题】:How to compare two pointers to object by their most derived type?如何通过它们的派生类型比较两个指向对象的指针?
【发布时间】:2009-10-11 07:26:00
【问题描述】:

我有以下类层次结构:

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 中的数据字段进行比较并检查 对象来自同一个派生类?

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

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

【问题讨论】:

  • 好吧,根据设计,派生对象不应该相互了解。为什么要这样做?
  • @GMan 同意。这是一种代码气味。您可能只是想更好地设计您的类层次结构并信任多态性。
  • “return d”是错误的,应该是return d!=NULL;
  • 我认为你需要重新考虑你的设计,也许如果你解释一下你为什么需要这样的设计,它会帮助我们更好地帮助你。

标签: c++ virtual function-pointers


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

我认为您可以在这里使用typeid 运算符。您可以执行以下操作:

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

但是你为什么要做这样的事情呢?看起来很可疑,建议重新看一下设计。

【讨论】:

  • 名称返回字符*。比较指针不对。直接使用 typeid(*this)==typeid(*pointerBase)
猜你喜欢
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 2012-02-05
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多