[英]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
之外的任何對,因為C
和E
都不是從另一對派生的。 要比較這些,你需要進行交叉投射,或者將它們轉換為它們的公共基類; 這些都不能隱含地完成。
順便說一句,您的代碼中不需要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.