繼承和派生:
(1)子類不加修改的延續父類的特徵,我們把它叫做繼承。
(2)在原有基礎上建立新類並且添加新新征的過程叫做“類的派生”。
(3)把原有的類叫做“基類”,又叫“父類”,把建立的類叫做“衍生類別”,又叫子類。
例如:class Son : public Father
(4)公有派生的公有成員仍然為公有成員;公有派生的保護成員仍然為保護成員;公有派生的私人成員是不能為派生訪問的。
(5)私人繼承:class Son : private Father
私人方式派生的子類,父類的公有和保護成員在子類中是私人的,而私人成員是不可訪問的;由於私人派生不利於繼續派生,所以實際中用的不多。不管以僅有還是私人形式繼承,基類的私人成員在衍生類別都是不可訪問的。
(6)單一繼承:只有一個基類
多重繼承:擁有多個基類(C#中沒有多重繼承)
例如:class Son : public Father,public Mother
(7)子類調用順序:構造父類對象→構造子類對象→析構子類對象→析構父類對象
當一個類中的包含子物件時,建構函式的調用 順序是先調用子物件的建構函式(按照它們在類定義時出現的順序,而不是按照構造列表中出現的順序),然後再調用當前對象的建構函式代碼,調用解構函式的順序與構造的順序剛好相反。
虛函數:
(1)在不使用virtual之前,C++對重載的函數使用靜態聯編,而使用virtual以後,C++則對該函數進行動態聯編。
(2)靜態聯編是指聯編工作出現在編譯串連階段,這種聯編又稱早期聯編,它解決了程式中的調用與執行該作業碼間的關係。在編譯時間所進行的這種聯編又稱靜態束定,在編譯時間就解決了程式中操作調用與執行該作業碼的關係。對於靜態聯編來說。由於已經確定了調用和被調用間的關係。對於靜態聯編來說,由於已經確定了調用和被調用的關係,因此代碼在編譯時間與執行時的效果都是一樣的。
(3)在程式執行時進行聯編工作的被稱為動態聯編,或稱動態束定,又叫晚期聯編。
(4)假如在虛函數中沒有採用指標或者引用,那麼就無法實現動態聯編。
(5)在虛函數中使用成員名限定(例如:A::get)可以強行解除動態聯編。
虛解構函式:
(1)一個衍生類別對象在建立時首先會調用基類的建構函式,然後調用該類的建構函式。一般情況下,在使用虛函數的時候,我們都會將派生對象的的指標傳遞給指向基類的指標,那麼假如指向衍生類別的對象的指標刪除時會發生什麼情況呢?如果解構函式是虛函數,那麼就會進行正確的操作,它會先調用衍生類別的解構函式,由於一般情況下任何類的解構函式都可以聲明為虛解構函式,當指標刪除時,系統就會獲得對象進行時的類型並調用正確的解構函式。
(2)由於解構函式不允許帶有參數,因此它不可能實現重載,那麼一個類就只能有一個虛解構函式。
(3)只要基類的解構函式被說明為虛解構函式,那麼衍生類別的解構函式無論說明與否,都自然成為虛解構函式。
(4)在C++中虛建構函式是不存在的,因此也無法聲明。
(5)如果基類中定義了虛函數,解構函式也應說明為虛解構函式,這樣對記憶體的回收會更準確些。
函數模板(STL的基礎)
(1)看下列例子:求絕對值的例子
int abs(int x)
{
return x<0?-x:x;
}
double abs(double x)
{
return x<0;-x:x;
}
這兩個函數除了參數類型不同,功能完全一樣,這個時候,就可以把這些功能相同、參數類型不同的函數抽象成一個模板,這就是函數模板。
函數模板的定義形式:template <typename 標識符>,關鍵字typename,也可以由關鍵字class代替函數定義部分。
所以上面求絕對值可以寫成:
template <typename T>
T abs(T x)
{
return x<0?-x:x;
}
注意:編譯器會在函數調用時推匯出函數模板的參數類型。記住是在編譯時間就已經推匯出參數類型的代碼,而不是在運行時才推導參數類型。
下面是一個完整的函數模板應用的例子:
template <class T>
T abs(T x)
{
return x<0 ? -x : x;
}
template <class T> T max(T tl,T t2)
{
return (t1 > t2) ? t1 : t2;
}
int main()
{
int a=-1;
int b=-2;
int c
abs(a);
abs(b)
c=max(a,b);
return 0;
}
相關文章:
• C/C++ 一點筆記(1)
• C/C++ 一點筆記(2)