class
czooanimal
virtual ~
czooanimal()
public
: virtual void
run(
)protected
: int m_loc;
std:
:string m_name;};
class
czoobear
:public czooanimal
~czoobear()
public
:void
run(
) virtual void
eat(
)protected
:enum ebeartype
;protected
: ebeartype m_type;
int m_high;
};
czooanimal aobj = obj;
aobj.
run(
);
這樣寫,aobj 就是努力在模仿obj,想表現為obj。但是,怎麼說來著:一直被模仿,從未被超越 ?
哪怕再努力一下,這樣寫:
czooanimal *paaobj =
&aobj;
paaobj-
>
run(
);
也呼叫不到czoobear::run(),也就是無論你怎麼轉換,再也回不去了。
真正的原因是:編譯器在czooanimal aobj初始化或aobj = objfuz賦值的時候,首先確保了aobj有乙個或乙個以上的vptrs,然後就是確保這個vptrs不會隨著初始化而改變。這兩步操作把我們所有的幻想給終結了,並且czooanimal aobj = obj的過程發生了切割(sliced),切割完成的aobj保持了純正的czooanimal 特性,乙個新的czooanimal在記憶體中誕生了,就是這樣。
借用書中的話總結一下:乙個指標(pointer)或引用(reference)之所以支援執行時多型,是因為它們並不引發任何"與型別有關的記憶體操作",會改變的,只是所指向記憶體的「內容和大小解釋方式」而已。
C語言深入學習之指標
一 指標是什麼?c語言裡,變數都是存放在記憶體裡,而記憶體其實就是一組有序位元組組成的陣列,每個位元組都有唯一的記憶體位址。cpu 通過記憶體定址對儲存在記憶體中的某個指定資料物件的位址進行定位。這裡,資料物件是指儲存在記憶體中的乙個指定資料型別的數值或字串,它們都有乙個自己的位址,而指標便是儲存這...
深入學習c 書單
本來有一本c 程式設計,一本c primer 沒怎麼看過 經過師兄推薦又買了effective c 和more effective c 技術面試的時候會問的比較深 要研究的比較透徹一些 第一篇一些同學問我,如何學好c 我沒有別的辦法給你們,唯一的辦法就是讀書,讀大 量的書,就可以解決。要把c 作為日...
C 深入學習 反射
目錄 一 概述 二 基本使用 2.1 獲取程式類容基本步驟 2.2 使用舉例 2.2.1 建立物件 訪問設定屬性值 使用其中無參方法 2.2.2 建立帶參建構函式並訪問其中帶參方法 2.2.3 反射過載過的方法 2.2.4 反射泛型類和泛型方法 2.2.5 反射型別中的私有類容 屬性 方法 2.2....