代碼:函數
class A { public: virtual void Debug(){} }; class B:public A { public: virtual void Debug(){} }; void main() { B b; A a = b; A * point_A = &b; a.Debug(); point_A->Debug(); }
分析:佈局
在程序中:a.Debug調用的是A::Debug,而point_A->Debug調用的是B::Debug。指針
——對於程序A a = b而言,b內存佈局在賦值的時候已經從B轉換到A了,多於的數據都被丟棄,所以其就是一個A類型變量,那麼a.Debug這裏的a就是一個A類型的變量。
——對於point_A來講,它是一個指針,其類型雖然是A,但指向的區域的內容倒是一個B類型的內存結構,雖然內存結果的佈局與A兼容,但其虛函數表中的Debug倒是B的實現。
code