首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 派生類別指標強制轉換為基類別指標的位址變化

     編輯:關於C++

現象

多重繼承下,派生類別指標轉基類別指標可能改變位址值(調整至對應基類別子物件起始位置)。

程式碼

/* test.cpp
 * Created on: 2014.04.21
 * Author: Spike
 */
#include <iostream>

class A { int m_nA; };
class B { int m_nB; };
class C : public A, public B { int m_nC; };

int main() {
    C* pc = new C;
    B* pb = pc; // 隱式轉換,位址調整至 B 子物件
    cout << "pc == pb : " << (pc == pb ? "equal" : "not equal") << endl;
    cout << "int(pc) == int(pb) : " << (int(pc) == int(pb) ? "equal" : "not equal") << endl;
    cout << "int(pc) == int((C*)pb) : " << (int(pc) == int((C*)pb) ? "equal" : "not equal") << endl;
    return 0;
}

輸出

pc == pb : equal
int(pc) == int(pb) : not equal
int(pc) == int((C*)pb) : equal

解析

  • pc == pb:指標比較會自動轉換為同型別再比較,語意相等。
  • int(pc) != int(pb):實際位址不同,pb 指向 C 內的 B 子物件(偏移 sizeof(A))。
  • int(pc) == int((C*)pb):將 pb 強轉回 C* 會還原偏移,位址相同。

結論

多重繼承下基類別子物件位址偏移是正常行為。避免直接比較指標整數值,應使用指標比較或 dynamic_cast 驗證關係。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved