簡體   English   中英

我何時可以將指針與c ++中的同一對象進行比較?

[英]When can I compare pointers to the same object in 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; };

使用強制轉換我得到指向主“大”對象的每個子對象的指針:

F * f = new F;
E * e = f;
C * c = f;
B * b = f;
A * a = f;

我可以比較這些指針的哪些對等(運算符==)和為什么? 比較是否會使用delta邏輯或其他技術?

當我無法比較指向同一復雜對象的指針時,有哪些可能的情況? 它可以是什么樣的物體?

我希望,所有指向同一對象的指針總是相等的。

你必須要小心。 例如,c和e是指向* f的不同方面的指針,因此它們實際上不是同一個對象。 幸運的是,如果你試圖比較c和e,編譯器會給你一個錯誤,因為一個不是從另一個得到的。 您的示例中的任何其他比較都將起作用,因為其中一個指針可以簡單地轉換為另一個指針的類型。

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; };

{
  F * f = new F;
  E * e = dynamic_cast<E*>(f);
  C * c = dynamic_cast<C*>(f);
  B * b = dynamic_cast<B*>(f);
  A * a = dynamic_cast<A*>(f);
  cerr << (a==b) << "\n"; // true
  cerr << (a==c) << "\n"; // true
  cerr << (a==e) << "\n"; // true
  cerr << (a==f) << "\n"; // true
  cerr << (b==c) << "\n"; // true
  cerr << (b==e) << "\n"; // true
  cerr << (b==f) << "\n"; // true
  cerr << (c==e) << "\n"; // compile error
  cerr << (c==f) << "\n"; // true
  cerr << (e==f) << "\n"; // true
}

如果一個指針類型可以隱式轉換為另一個指針類型,則可以比較兩個指針; 也就是說,如果它們都指向相同的類型,或者指向另一個的基類。 轉換將對地址進行必要的調整,這樣,如果兩個指針指向同一個對象,它們將比較相等。

在這種情況下,您可以比較除c == e之外的任何對,因為CE都不是從另一對派生的。 要比較這些,你需要進行交叉投射,或者將它們轉換為它們的公共基類; 這些都不能隱含地完成。

順便說一句,您的代碼中不需要dynamic_cast ,因為您正在轉換為基類指針,並且可以隱式地進行安全轉換。

通常,要確保兩個指針(可能是不同類型)指向同一個對象,請使用

dynamic_cast<void*>(pointer1) == dynamic_cast<void*>(pointer2)

當然,兩種指針類型都應該是polimorphic以提供正確的dynamic_cast

如果類層次結構具有單個(可能是虛擬的)根,則可以將兩個poiners轉換為指向根類的指針,然后比較兩個結果(無動態轉換)

您只能比較相同類型的指針。 但是,您並不總是需要顯式強制轉換才能執行此操作。 在簡單的情況下:

B * pB = new B();
A * pA = pB;

if (pA == pB)  {}  //pB is implicitly cast to an A *

當你進入更復雜的類時,你需要添加顯式的強制轉換

F * pF = new F();
C * pC = dynamic_cast<C *>(pF)
A * pA1 = dynamic_cast<A *>(pF);
A * pA2 = dynamic_cast<A *>(pC);

//should all be true
if (pF == dynamic_cast<F *>(pA)) {}
if (pA1 == dynamic_cast<A *>(pF)) {}
if (pA1 == pA2) {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM