1.派生類物件由多個部分組成:派生類本身定義(非static)成員加上由基類(非static)成員組成的子物件。
2.多繼承的定義格式。
clash 派生類名:繼承方式1 基類名1,繼承方式2 基類名2{};
3如果乙個類有多個直接基類,而直接基類又有乙個共同的基類,則在最低層的派生類中會保留這個間接的共同基類資料成員的多份同名成員。
4.基類成員在派生類中的訪問屬性
基類中的私有成員都不允許派生類繼承,即在派生類中不可見。
public 繼承 : 外部可以訪問public,其他不可見。內部函式或者友元函式可以訪問protect和public
protect繼承: 外部不可以訪問。 內部函式或者友元函式可以訪問protect和public
private繼承: 外部不可訪問。 內部函式或者友元函式可以訪問protect和public。無法往下繼承。
5.c++基本型別的指標之間不含有隱式轉換(void *除外,const的某些用法是為了相容c語言也可以隱式轉換),需要顯示轉換。故char *不能隱式的轉換成int *
而僅當型別之間可以隱式轉換(除類層次間的下行轉換),static_cast的轉換才是合法的,否則將出錯。
6.自定義型別的轉換規則:
《1.在公有繼承方式下,(私有、保護繼承不能發生隱式轉換),派生類的物件、物件指標、物件引用可以賦值給基類(發生隱式轉換)基類不可以直接賦值給派生類。因為派生類包含了基類的所有資訊,而基類缺乏派生類中的資訊。
《2.c++允許把基類的物件指標 /引用 強制轉換(顯示)成派生類的物件指標/引用。
《3.乙個指向基類的指標可以用來指向該基類公有派生類的任何物件。實現多型。
7.把子類的指標或引用轉換成基類指標或引用是上行轉換。注意:在派生類和基類進行比較的時候,可能會發生隱式轉換,派生類轉換成基類。
8.在多基繼承時,如果多個基類中存在同名成員的情況,造成編譯器無從判斷具體要訪問哪個基類中的成員,則稱為對基類成員訪問的二義性問題。
若具有同名的資料成或成員函式,應使用成員名限定來消除二義性。
a;; 成員名限定
或這命名個同名函式。
9菱形繼承。或喊聲重疊子物件。採用虛基類,可以解決。
10.轉換建構函式
11.型別轉換函式
轉換函式必須是成員函式,不能是友元形式,不能制定返回型別,但在函式體內必須用return語句以傳值方式返回乙個目標型別的變數,轉換函式不能有引數。
operator in t()
12.c++提供了關鍵字explicit,可以阻止不應該允許的經過轉換建構函式進行的隱式轉換的發生。宣告為explicit的建構函式不能在隱式轉換中使用。
13.多型性是指同乙個操作作用於不同的物件就會產生不同的響應。
c++依靠虛函式實現動態多型的。
14.c++通過虛函式實現動態聯編。
15.使用指標訪問非虛函式時,編譯器根據指標本身的型別決定要呼叫哪個函式。不是動態聯編。
使用指標訪問虛函式時,編譯器根據指標所指物件的型別決定要呼叫哪個函式(動態聯編)
引用和指標類似,不同的是引用一經宣告後,引用變數本身無論如何改變,其呼叫的函式就不會改變,始終指向開始定義的函式。
16 派生關係中的基類析構函式宣告為虛函式。
17 虛函式表指標vptr
虛基類表指標bptr
18虛函式表指標
物件中的靜態防止在程式的全域性儲存區,故不會影響個別的物件的大小。static和非static也放在所有的物件之外。
每乙個類產生一堆指向虛函式的指標,放在虛函式表。
每個物件新增了乙個指標,指向相關的虛函式表。vptr 是物件中有的虛函式表指標。
19 普通函式不存在於物件中,虛函式要使用到虛表指標(存在於物件中)
20.結構或者類中的靜態成員不對結構或者類的大小產生影響。
21空類的大小為1
22.多基繼承時,有幾個基類就有幾個vptr.
23.虛基類表指標
在虛擬繼承的情況下,基類不管在繼承串鏈中被派生多少次,永遠只會存在乙個實體。
在虛擬繼承基類的子類中,子類會增加某種形式的指標,或者指向虛基類子物件,或者指向乙個相關的**,此指標成為bptr
在同時存在vptr和bptr時,某些編譯器會將其進行優化,合併為乙個指標。
24.凡是含有純虛函式的類稱為抽象類。這種類不能宣告物件,只是作為基類為派生類服務。除非在派生類中完全實現基類中所有的純虛函式,否則,派生類也是抽象類,不能例項化物件。 純虛函式後面宣告=0
只定義了protected型建構函式的類也是抽象類。
25.抽象類不能定義物件,但是可以作為指標或者引用型別使用。
26.執行時型別識別,程式能夠使用基類的指標或引用來檢索這些指標或引用所指物件的實際型別。
typeid 操作符,返回指標或引用所指物件的實際型別。
dynamic _cast操作符 ,將基類型別的指標或引用安全的轉換為派生型別的指標或引用。
27.顯式轉換也程為強制型別轉換,包括以下名字命名的強制型別轉換操作符
static_cast 編譯器隱式執行的任何型別轉換都可以由static_cast顯示執行。但是僅當型別之間可隱式轉換時,static_cast才是合法的,否則將出錯。
c++基本型別的指標之間不含有隱式轉換(void *除外,const的某些用法是為了相容c語言也可以隱式轉換),需要顯示轉換。故char *不能隱式的轉換成int *
而僅當型別之間可以隱式轉換(除類層次間的下行轉換),static_cast的轉換才是合法的,否則將出錯。
dynamic_cast
把表示式轉換成type型別的物件。type必須是類的指標、類的引用或者vodi*
涉及執行時類的檢查,dynamic_cast執行時需要檢查需要執行時型別的資訊,必須是定義了虛函式的類。沒有虛函式表的類使用會編譯錯誤。
如果轉換到指標型別的dynamic_cast失敗,則返回0
如果轉換到引用型別的dynamic_cast失敗 則異常
如果dynamic_cast運算元中的類無虛函式,則會提示dynamic_cast的運算元必須包含多型型別。
const_cast 將轉換表示式的const性質,去掉const
reinterpert_cast 效果和使用圓括號實現相似。
28.在面對物件技術中,多型性是指針對一訊息,不同物件可以以適合自身的方式加以響應。
29.切記 虛函式的范文。使用指標訪問虛函式時,必須要用到vptr,虛函式指標存在於具體的物件中。
30.static _cast(p) 如果base *p=&d 其中d是子類。則 static_cast會自動隱式轉換成base類。這個要注意!!!
31棧上的記憶體不需也不能呼叫delete刪除。
32 extern可以用在變數上,也可以用在函式上。
33.如果dynamc_cast轉換的類之間沒有關係,則轉換成的指標將為空。
面對物件程式設計
重要的是什麼,是概念的理解。類是什麼,物件是什麼,然後封裝是什麼,繼承是什麼,多型是什麼。類是抽象的,高度概括的物件集合體。當然亂寫的類什麼都不是,轄七八糟往乙個類裡塞。這也是不合理的。這是學到目前為止,最為有用的一節課。非常的有用。就是基本概念的講解。概念的理解多少,決定你走多遠。class st...
面對物件程式設計4
issubclass and isinstance issubclass 用於判斷類物件與類物件之間的關係 isinstance 用於判斷例項物件與類物件之間的關係 issubclass a,b,c,d 判斷後者是否存在a的父類 isinstance 接受兩個實參 第乙個實參是例項物件 第二個實參是...
Python面對物件程式設計基礎 學習筆記
把物件作為基本單位,把物件抽象為類,包含成員和方法 資料封裝 繼承 多型 可覆蓋父物件方法 python中使用類實現。過稱式程式設計 函式 oop 類 類變數由所有例項共享 例項變數有例項單獨享有,不同例項直接沒有影響 當我們需要乙個類的不同例項之間共享變數的時候使用類變數 都可以通過class.m...