c 三大特性之 繼承

2021-07-28 10:56:56 字數 3495 閱讀 5224

繼承:乙個非常自然的概念,現實中的很多事情都是具有繼承性的。類似於自己繼承父母的特性,這也是繼承的特性:

而繼承的上層稱為基類,下一層就叫做派生類。

格式: class 派生類 : 繼承方式 基類

繼承

例如:

#include

using

namespace

std;

class person

;class student :public person //其中,學生類繼承了人類的屬性

;int main()

我們可以發現,學生也是人,可以具有人類的任何屬性

輸出結果為

18 1

12 24

我們也能輕易發現在這段**中,public的繼承方式下,學生類的size 變成了24,說明學生類全部繼承人類的屬性,那麼是不是就可以說繼承就是派生類繼承基類的所有屬性呢?還是只是在公有繼承方式下才能夠繼承所有屬性,還是在公有繼承下繼承公有成員呢??等等,一系列問題,那我們在看一段**來了解

#include

using

namespace

std;

class base

~base()

void showbase()

private:

int pri;

protected:

int pro;

public:

int pub;

};class derived :public base

~derived()

void showderived()

public:

int d_pub;

private:

int d_pri;

protected:

int d_pro;

};int main()

輸出結果為

base()

derived()

base()

24 12

還是public繼承的方式,在程式中我們可以看到在derived類中訪問base類的private成員是非法的,也就是無法訪問,但是看位元組大小,我們可以知道base類的private成員是被繼承了的,但是只是無法訪問。當把繼承方式換成我們之前從未接觸的protected時,結果是不變的,這也是protected出現的原因了。

再說說其中物件的呼叫順序,很明顯,在建立物件的時候,由base直接建立的物件就只呼叫base(),而由derived建立的物件則是先呼叫base(),在呼叫derived()的,這是建構函式的呼叫,那麼自然而然,析構函式則是相反的順序,就不多說了。

protected

在說一說protected,基類的private成員在派生類中是不能被訪問的,如果基類的成員不想被類外直接訪問,但需要在派生類中被訪問,就定義protected。

來舉個栗子吃吃看:

在上面的**的derived類中新增成員函式,並將繼承方式改為protected

void show()

會發現b.pro是可以被訪問的,這就是protected的用法。

如果不給出顯式的繼承方式,那麼系統將預設為private繼承,但是一般情況下還是給出繼承型別比較好。特別的,struct的預設繼承方式是public。

再說說同名隱藏

直接上栗子,開吃:

#include

using

namespace

std;

class base

;class derived :public base

;int main()

輸出結果

2 1

2同名的成員還是繼承了,只是在呼叫的時候訪問derived類,也就是同名隱藏直接將base類中的成員遮蔽掉了,但是還是繼承了,並且也可以通過::來進行訪問。這裡有必要提一下過載,過載是同乙個作用域內進行功能的重寫,而同名隱藏則是不同作用域的使用,有著本質的區別。

友元函式是不能被繼承的!!!!友元函式是不能被繼承的!!!!友元函式是不能被繼承的!!!!

多繼承

多繼承,顧名思義,也就是乙個derived類有多個(不止兩個)base類,第四盤栗子了:

class base1

;class base2

;class derived :public base1, public base2

;int main()

這就是多繼承,那麼我們來看看多繼承的記憶體順序

很明顯多繼承先儲存的是base類中的成員,base的成員則是按照繼承的順序來儲存的

菱形繼承

菱形繼承也就是鑽石繼承

程式如圖

#include

using namespace std;

class base

;class c1 :public base

;class c2 :public base

;class derived :public c2, public c1

;int main()

我們從上面的程式可以看到,菱形繼承存在一些問題。也就是二義性,當我們讓物件訪問_b的時候會出錯,原因就是,二義性,base1從base中繼承了乙個_b,base2也從base中繼承了乙個_b,顯然這兩個_b都被derived繼承了,那麼,我們直接訪問_b的時候,系統就會報錯「對_b的訪問不明確」。

所以引入下面這個概念

虛繼承

虛繼承解決了在菱形繼承體系裡面子類物件包含多份父類物件的資料冗餘&浪費空間的問題。

虛繼承體系看起來好複雜,在實際應用我們通常不會定義如此複雜的繼承體系。一般不到萬不得已都不要定義菱形結構的虛繼承體系結構,因為使用虛繼承解決資料冗餘問題也帶來了效能上的損耗。

#include

using

namespace

std;

class base

;class c1 :virtual

public base

;class c2 :virtual

public base

;class derived :public c2, public c1

;int main()

這樣就解決的二義性所造成的問題

C 三大特性之繼承簡述

一 概念 派生類,基類 protected的成員,只能在成員方法中訪問 預設繼承方式為private 二 例項化方式 1 堆中例項化物件 worker p new worker delete p delete手動釋放記憶體,否則記憶體洩漏 p null 將指標至於安全狀態 2 棧中例項化物件 wor...

C 三大特性 繼承

繼承 類的繼承,就是新的類從已有類那裡得到已有的特性。原有的類稱為基類或父類,產生的新類稱為派生類或子類。派生類的宣告 class 派生類名 繼承方式 基類名1,繼承方式 基類名2,繼承方式 基類名n 在 c 中,乙個派生類可以同時有多個基類,這種情況稱為多重繼承。如果派生類只有乙個基類,稱為單繼承...

C 三大特性之封裝,繼承,多型

在嵌入式的軟體開發過程中大多是使用c這種面向過程的語言來開發,從效率上來說c語言已經非常高了,使用在硬體資源比較緊張的嵌入式系統來說是最好不過的選擇了,隨著硬體效能的提公升,以及硬體 的下降,c 逐漸應用於嵌入式系統中了,c 語言在編譯器開優化的情況下,效率已經接近c語言了,並且提供了更高階的語言特...