衍生類別的繼承方式總結:
| 繼承方式 |
說明 |
| public |
基類的public和protected的成員被衍生類別繼承後,保持原來的狀態 |
| private |
基類的public和protected的成員被衍生類別繼承後,變成衍生類別的private成員 |
| protected |
基類的public和protected的成員被衍生類別繼承後,變成衍生類別的protected成員 |
註:無論何種繼承方式,基類的private成員都不能被衍生類別訪問。從上面的表中可以看出,聲明為public的方法和屬性可以被隨意訪問;聲明為protected的方法和屬性只能被類本身和其子類訪問;而聲明為private的方法和屬性只能被當前類的對象訪問。
1. 友元函數必須在類中進行聲明而在類外定義,聲明時須在函數傳回型別前面加上關鍵字friend。友元函數雖不是類的成員函數,但它可以訪問類中的私人和保護類型資料成員。
2. 虛函數在重新定義時參數的個數和類型必須和基類中的虛函數完全符合,這一點和函數重載完全不同。
3. #include <檔案名稱>和#include "檔案名稱" 檔案包含的兩種格式中,第一種格式用來包含那些由系統提供的並放在指定子目錄中的標頭檔;而第二種格式用來包含那些由使用者自己定義的放在目前的目錄或其他目錄下的標頭檔或其它源檔案。
4. 數組也可以作為函數的實參和形參,若數組元素作為函數的實參,則其用法與變數相同。當數組名作為函數的實參和形參時,傳遞的是數組的地址。當進行按值傳遞的時候,所進行的值傳送是單向的,即只能從實參傳向形參,而不能從形參傳回實參。形參的初值和實參相同,而形參的值發生改變後,實參並不變化,兩者的終值是不同的。而當用數組名作為函數參數進行傳遞時,由於實際上實參和形參為同一數組,因此當形參數組發生變化時,實參數組也隨之發生變化。
註:實參數組與形參數群組類型應一致,如不一致,結果將出錯;形參數組也可以不指定大小,在定義數組時數組名後面跟一個空的方括弧,為了在被調用函數中處理數組元素的需要,可以另設一個參數,傳遞數組元素的個數。如:int sum(int array[],int n);
5. 重載、覆蓋和隱藏的區別。
函數的重載是指C++允許多個同名的函數存在,但同名的各個函數的形參必須有區別:形參的個數不同,或者形參的個數相同,但參數類型有所不同。
覆蓋(Override)是指衍生類別中存在重新定義的函數,其函數名、參數列、傳回值類型必須同父類中的相對應被覆蓋的函數嚴格一致,覆蓋函數和被覆蓋函數只有函數體 (花括弧中的部分)不同,當衍生類別對象調用子類中該同名函數時會自動調用子類中的覆蓋版本,而不是父類中的被覆蓋函數版本,這種機制就叫做覆蓋。
下面我們從成員函數的角度來講述重載和覆蓋的區別。
成員函數被重載的特徵有: 1) 相同的範圍(在同一個類中);2) 函數名字相同;3) 參數不同;4) virtual關鍵字可有可無。
覆蓋的特徵有: 1) 不同的範圍(分別位於衍生類別與基類);2) 函數名字相同;3) 參數相同;4) 基類函數必須有virtual關鍵字。
比如,在下面的程式中: #include < iostream.h >
class Base
{
public :
void f( int x){ cout << " Base::f(int) " << x << endl; }
void f( float x){ cout << " Base::f(float) " << x << endl; }
virtual void g( void ){ cout << " Base::g(void) " << endl;}
};
class Derived : public Base
{
public :
virtual void g( void ){ cout << " Derived::g(void) " << endl;}
};
void main( void )
{
Derived d;
Base * pb = & d;
pb -> f( 42 ); // 運行結果: Base::f(int) 42
pb -> f( 3.14f ); // 運行結果: Base::f(float) 3.14
pb -> g(); // 運行結果: Derived::g(void)
}
函數Base::f(int)與Base::f(float)相互重載,而Base::g(void)被Derived::g(void)覆蓋。
隱藏是指衍生類別的函數屏蔽了與其同名的基類函數,規則如下: 1) 如果衍生類別的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。2) 如果衍生類別的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)。
比如,在下面的程式中:
#include < iostream.h >
class