一、非多型繼承
1.派生類中每個基類的子物件都要保持其完整性,即每個子物件都與獨立物件記憶體布局相同,都會經過alignment(會造成**膨脹)
2.物件拷貝的內容根據指標型別決定,如下列**只拷貝子物件concrete1的內容(不論指標實際指向**)
concrete1 *pc1_1,*pc1_2;二、多重繼承*pc1_2=*pc1_1;
②多重繼承中的其餘繼承鏈均不滿足自然多型需要將指標進行轉換。如下圖,基類vertex到最終派生類vertex3d需要進行位址轉換。並且當實現多型的是指標時還需要測試條件(測試是不是空指標,引用不需要,引用不能繫結到nullptr)
vertex3d v3d;vertex *pv;
point2d *p2d;
point3d *p3d;
//第一繼承鏈,直接拷貝位址
p2d=&v3d;
p3d=&v3d;
//引用
pv=&v3d;
//轉換為
pv=(vertex*)(((char*)&v3d)+sizeof
(point3d));
//指標
vertex3d *pv3d;
pv=pv3d;
//轉化
三、虛擬繼承
1.傳統虛擬繼承模型:在每個派生類中新增乙個指向基類子物件的指標
造成的問題①每乙個物件針對每乙個虛基類都要產生乙個指標。(類物件的記憶體不固定隨虛基類的數量變化)
②訪問層次增加(如果有多層虛擬派生,則訪問需要經過多次指向虛基類的指標)
2.現代虛擬繼承模型:
(1)解決第二個問題:將指向虛基類的指標放入到所有派生類物件當中。(空間換時間)
(2)解決第乙個問題:
①microsoft引入虛基類表。類中增加乙個指向虛基類表,表中存放真正的指向虛基類的指標。
②在虛函式表中放置虛基類的偏移offset。sun編譯器虛函式表中正值索引代表虛函式,負值索引代表虛基類的偏移。
四、指向成員的指標
1.形式: t class::*x。其中t為型別,class為類名,x為類class的成員。
2.使用:object.*x 代表訪問物件object的成員x
4.作用可以用來確定物件在記憶體中的排列順序或者記憶體的布局 &class::x > &class::y 代表x排列在y之前(若x和y在同一訪問域則代表y宣告在x宣告之前)
5.訪問效率:未經過編譯器優化時效率低於直接訪問(多了一層指標的訪問具有間接性)。
第三章 類和成員
1 類和結構 1 類和結構實際上都是建立物件的模板,每個物件都包含資料,並提供了處理和訪問資料的方法。class phonecustomer 2 結構與類的區別是它們在記憶體中的儲存方式 類是儲存在堆 heap 上的引用型別,而結 構是儲存在堆疊 stack 上的值型別 訪問方式和一些特徵 如結構不...
第三章 繼承
通過擴充套件或者修改既有類來定義新類的方法叫做繼承 inheritance 子類可以 追加新的方法 追加新的例項變數 重寫定義父類中的方法 父類和子類是一種相對稱呼 在集合用語中,子集指的是比較小的集合,但在類的情況下子類一般是父類的擴充套件。oc有唯一根類,所有物件直接或間接繼承了nsobject...
第三章,檢索資料
select prod name from products 上述語句利用select 語句從products表中檢索乙個名為prod name的列,所需要的列名在select 關鍵字之後給出,from關鍵字指出從其中檢索資料的表名 select prod name,prod id,prod nam...