類似代碼如下:
class A
{
public:
virtual void Test(){}
};
class B:public A
{
public:
virtual void Test(){}
};
B b;
A a = b;
A * pA = &b;
a.Test();
pA->Test();
大家都知道a.Test調(diào)用的是A::Test,而pA->Test調(diào)用的是B::Test,那么為什么呢?
首先來看a.Test;其實(shí)很容易理解,這里的a就是一個(gè)A類型的變量,它的內(nèi)存布局在賦值的時(shí)候已經(jīng)從B轉(zhuǎn)換到A了,多于的數(shù)據(jù)都被丟棄,因此其就是一個(gè)A類型的變量。
而對于pA來說,其是一個(gè)指針,其類型雖然是A,但指向的區(qū)域的內(nèi)容卻是一個(gè)B類型的內(nèi)存結(jié)構(gòu),雖然內(nèi)存結(jié)果的布局與A兼容,但其虛函數(shù)表中的Test卻是B的實(shí)現(xiàn);因此如上面所說。同樣引用也會(huì)達(dá)到如此的效果。
我想這就是所說的指針和引用不會(huì)引發(fā)內(nèi)存中任何“與類型有關(guān)的內(nèi)存委托操作”吧。