在 c++ 中可重用性是通過繼承這一機制實現的。繼承允許我們依據另乙個類來定義乙個類,這使得建立和維護乙個應用程式變得更容易。這樣做,也達到了重用**功能和提高執行效率的效果。
當建立乙個類時,不需要重新編寫新的資料成員和成員函式,只需指定新建的類繼承了乙個已有的類的成員即可。這個已有的類稱為基類,新建的類稱為派生類。
繼承與派生,是同一種意義兩種說法。繼承代表了 is a 關係。例如,哺乳動物是動物,狗是哺乳動物,因此,狗是動物。
如:b 類繼承 a 類,可稱從類 a 派生類 b。類 a 稱為基類(父類),類 b 稱為派生類(子類)。
派生類的成員,包含兩大部分,一類是從基類繼承過來的,一類是自己新增的成員。從基類繼承過來的成員表現其共性,而新增的成員體現了其個性,派生類有了自己的個性,使派生類有了意義。
注意:乙個派生類繼承了所有的基類方法,但下列情況除外:
當乙個類派生自基類,該基類可以被繼承為 public、protected 或 private 幾種型別。
注意:1. 無論何種方式繼承基類,派生類都不能直接使用基類的私有成員。
2. 繼承時,如果未使用訪問修飾符,則繼承型別預設為 private。
乙個類可以派生自多個類,如果只派生乙個,即為單繼承。語法如下:
class 派生類名:繼承型別 基類名
;
繼承型別即是訪問修飾符,是 public、protected 或 private 其中的乙個。如果未使用訪問修飾符,則預設為 private。假設有乙個基類 shape,rectangle 是它的派生類,如下所示:
#include using namespace std;
// 基類
class shape
void setheight(int h)
protected:
int width;
int height;};
// 派生類
class rectangle: public shape};
int main(void)
當上面的**被編譯和執行時,它會產生下列結果:
total area: 35
多繼承即乙個子類可以有多個父類,它繼承了多個父類的特性。語法如下:
class 派生類名:繼承型別1 基類名1,繼承型別2 基類名2,...
;
繼承型別即是訪問修飾符,是 public、protected 或 private 其中的乙個。如果未使用訪問修飾符,則預設為 private。各個基類之間用逗號分隔。
假設有乙個派生類 rectangle 繼承於 基類 shape 與 基類 paintcost,如下所示:
#include using namespace std;
// 基類 shape
class shape
void setheight(int h)
protected:
int width;
int height;};
// 基類 paintcost
class paintcost };
// 派生類
class rectangle: public shape, public paintcost};
int main(void)
上面的**被編譯和執行時,它會產生下列結果:
total area: 35
total paint cost: $2450
如果乙個派生類從多個基類派生,而這些基類又有乙個共同的基類,則在對該基類中宣告的名字進行訪問時,可能產生二義性。
要使這個公共基類在派生類中只產生乙個子物件,必須對這個基類宣告為虛繼承,使這個基類稱為虛基類。
虛繼承宣告使用關鍵字 virtual
語法如下:
class 類名: virtual 繼承型別 父類名
繼承型別即是訪問修飾符,是 public、protected 或 private 其中的乙個。如果未使用訪問修飾符,則預設為 private。
型別相容規則是指在需要基類的任何地方,都可以使用公有(pulic)派生類的物件來替代。
型別相容規則中所指的替代包括以下情況:
子類物件可以當做父類物件使用
子類物件可以直接賦值給父類物件
子類物件可以直接初始化父類物件
父類指標可以直接指向子類物件
父類引用可以直接引用子類物件
在替代之後,派生類物件就可以作為基類的物件使用,但是只能使用從基類繼承的成員。
示例**如下所示:
// inherittest1.cpp,
// 用於驗證型別相容規則
/*型別相容規則中所指的替代包括以下情況:
1. 子類物件可以當做父類物件使用
2. 子類物件可以直接賦值給父類物件
3. 子類物件可以直接初始化父類物件
4. 父類指標可以直接指向子類物件
5. 父類引用可以直接引用子類物件
*/#include using namespace std;
class parent
int parent_age;
};class child : public parent
};void printbypoint(parent *parent)
void printbyreference(parent& parent)
int main()
執行結果:
子類物件在建立時會首先呼叫父類的建構函式,父類建構函式執行結束後,執行子類的建構函式
2.當父類的建構函式有引數時,需要在子類的初始化列表中顯式呼叫
3.析構函式呼叫的先後順序與建構函式相反
示例**如下所示:
// inherittest2.cpp,繼承中構造析構呼叫原則
#include using namespace std;
class parent
~parent()
private:
const char* s;
};class child : public parent
child(int temp_age,const char *temp_s):parent(temp_s)
~child()
private:
int age;
};int main()
執行結果:
C 基礎 四 繼承和派生
1 類和類之間的關係 include using namespace std classa 1 包含關係 b has a class b a a 2 依賴關係 c use a classc 3 繼承關係 d extend a classd public a intmain void 執行結果 fun...
c 繼承和派生
通常子類不加修飾的延續父類的特徵,我們把它叫做繼承 而子類在延續父類特徵的基礎上又新增自己的新特徵,叫做派生。擁有乙個基類的繼承是單一繼承,擁有多個基類的繼承是多重繼承。class 派生類名 派生型別 基類名 注 括號內是派生類自己的成員和成員函式。乙個類的私有成員只能被它的成員函式和友員訪問,不能...
C 繼承和派生
在c 語言中,乙個 派生類可以從乙個 基類派生,也可以從多個基類派生。從乙個基類派生的繼承稱為單繼承 從多個基類派生的繼承稱為 多繼承。派生類的定義格式 單繼承的定義格式如下 1 2 3 4 class 派生類名 繼承方式 基類名 public 表示公有繼承 private 表示私有繼承 prote...