搜尋

首頁  >  問答  >  主體

c++ - 为什么这三个指针值不一样?

#include <iostream>
using namespace std;
class A
{
public:
    virtual void functionA() { }
};

class B
{
public:
    virtual void functionB() { }
};

class C :public A, public B
{

};

int main()
{
    C obj;
    A *pa = &obj;
    B *pb = &obj;
    C *pc = &obj;
    cout << pa << endl;
    cout << pb << endl;
    cout << pc << endl;

    return 0;
}  

我运行的结果是这样的:
00EFFBA8
00EFFBAC
00EFFBA8
也就是 pa 和 pc 是一样的,但是 pb 总是不一样,
我的问题是为什么三个指针值是不同的?

黄舟黄舟2773 天前465

全部回覆(1)我來回復

  • PHP中文网

    PHP中文网2017-04-17 14:37:23

    在《effective c++》第三版第27條款中,Scott Meyers說

    有個偏移量(offset)在運行期被施行於Derived*指針身上,用以​​取得正確的Base*指針值.


    實際上一旦使用多繼承,這事幾乎一直發生著,即使在單一繼承中也可能發生。

    你可以看下書

    這裡就是編譯器做了偏移。因為那個衍生類別從基底類別繼承來了兩個指針,然後用基底類別指針指向派生類別的時候,指針就偏移到該基底類別在派生類別中的位置了,這裡的偏移剛好是一個指針大小的距離。

    你可以在A那個裡面加一些變量,用B的指標指向衍生類別時,偏移量就等於sizeof(A)。但是如果存在空基類的話,位址就可能都一樣的了,因為編譯器會做空基類的最佳化。


    怎麼都沒見你採納過答案,(●ˇ∀ˇ●),哈哈

    回覆
    0
  • 取消回覆