我何时可以将指针与c ++中的同一对象进行比较?

aby*_*s.7 5 c++

例如,我有一些类层次结构(可能具有各种继承 - 公共,私有,公共虚拟,多继承等):

class A {
  int a;
public:
  virtual ~A() {}
};

class B: public A { int b; };
class C: public virtual B { int c; };
class E: public virtual B { int e; };
class F: public C, public E { int f; };
Run Code Online (Sandbox Code Playgroud)

使用强制转换我得到指向主"大"对象的每个子对象的指针:

F * f = new F;
E * e = f;
C * c = f;
B * b = f;
A * a = f;
Run Code Online (Sandbox Code Playgroud)

我可以比较这些指针的哪些对等(运算符==)和为什么?比较是否会使用delta逻辑或其他技术?

当我无法比较指向同一复杂对象的指针时,有哪些可能的情况?它可以是什么样的物体?

我希望,所有指向同一对象的指针总是相等的.

Mik*_*our 3

如果一种指针类型可以隐式转换为另一种类型,则可以比较两个指针;也就是说,如果它们都指向同一类型,或者一个指向另一个的基类。转换将对地址进行必要的调整,以便如果两个指针都指向同一个对象,则它们将比较相等。

在这种情况下,您可以比较除 之外的任何对c == e,因为 和 都不CE从另一个派生的。要比较它们,您要么需要交叉转换,要么将它们转换为它们的公共基类;这些都不能隐式完成。

顺便说一句,您的代码中不需要dynamic_cast,因为您正在转换为基类指针,并且可以隐式完成安全转换。