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

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

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

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

最佳答案

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

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

关于c++ - 如何通过派生类型比较两个指向对象的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1550091/

相关文章:

c++ - 处理非常大的多语言项目

c++ - 在定义失败之前使用 constexpr 函数

c - 什么是 void (*pfunc[3])()?

c++ - 如何将 C 函数指针迁移到 C++?

c++ - 如何递归取消引用指针(C++03)?

c++ - 使用 OpenCV 读取 PDF 文件

c# - p/从在 x64 机器上运行的 C# 程序调用 32 位 dll

python - 为什么 Visual Studio Code 找不到我的虚拟环境安装的模块?

c++ - 如何加速我的面向对象的 Iterator 类?

c++ - 如何使用继承的方法和相同的基类方法?