#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 总是不一样,
我的问题是为什么三个指针值是不同的?
PHP中文网2017-04-17 14:37:23
在《effective c++》第三版第27條款中,Scott Meyers說
有個偏移量(offset)在運行期被施行於Derived*指針身上,用以取得正確的Base*指針值.
實際上一旦使用多繼承,這事幾乎一直發生著,即使在單一繼承中也可能發生。
你可以看下書
這裡就是編譯器做了偏移。因為那個衍生類別從基底類別繼承來了兩個指針,然後用基底類別指針指向派生類別的時候,指針就偏移到該基底類別在派生類別中的位置了,這裡的偏移剛好是一個指針大小的距離。
你可以在A那個裡面加一些變量,用B的指標指向衍生類別時,偏移量就等於sizeof(A)。但是如果存在空基類的話,位址就可能都一樣的了,因為編譯器會做空基類的最佳化。
怎麼都沒見你採納過答案,(●ˇ∀ˇ●),哈哈