C 基礎 4 繼承和派生

2022-06-18 04:51:07 字數 3934 閱讀 9806

在 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...