物件導向c 之繼承

2021-07-17 03:52:30 字數 3663 閱讀 1866

物件導向三大機制包括:

1.封裝,隱藏內部實現。

2.繼承,復用現有**。(物件導向最顯著的特徵)

3.多型,改寫物件行為。

繼承,是一種復用的手段。是從先輩處得到屬性和行為特徵。類的繼承就是新的類從已 有

的類那裡得到已有的特徵。

類成員的訪問限定有三種:public,protected,private,在類外可以訪問類的公有成員,

私有和保護都不可以訪問。**舉例:

#includeusing namespace std;

class a

public:

int _pub;

protected:

int _pro;

private:

int _pri;

};int main()

**編譯不通過,提示不可訪問類的私有和保護成員。

也有3種繼承關係:public(公有繼承),protected(保護繼承),private(私有繼承)

那麼父類成員在子類中的訪問屬性究竟會是怎樣的呢?

【總結】在繼承機制下,無論哪種繼承方式,子類中可以訪問父類的公有保護成員,

私有成員不可訪問;

在類外,只能訪問公有成員,私有和保護都不可訪問。這個可以通

過**去驗證。

類外只能訪問類的公有成員。如果一些父類成員不想被父類物件直接訪問,但是需

要在派生類中訪問,就定義成保護成員。

protected成員的特點:「外人」不可訪問,「兒

子」可以訪問。

class中繼承方式預設是private,struct中預設是public。

類與類之間的關係有三種:

1.has-a,乙個類的成員是另乙個類的物件;私有繼承是另一種實現has-a的途徑。

2.uses-a,

乙個類的成員函式的引數是另乙個類的物件

3.is-a,公有繼承,父類可用的成員對子類也是可用的。

賦值相容規則:

前提:public繼承下。

1.父類物件 = 子類物件

舉例:人通過繼承得到超人,即超人具備人的特性,當然也有其本身特有的功能。

人 = 超人(超人的特異功能不被賦值)

2.父類物件不可賦值給子類物件。

3.父類指標可以指向子類物件,如圖。子類指標不可以指向父類物件。

但是可以通過

強制型別轉換

完成。但是也可能會出現一定的問題。(下邊的**)

4.父類物件的引用可以引用子類物件。(與指標同理)

class b

void show()

public:

int _pub;

protected:

int _pro;

private:

int _pri;

};class d:public b

void show(int )

int _i;

};int main()

執行之後會出現程式崩潰。所以盡量不要強轉。

注:建立子類物件時,會先呼叫父類的建構函式,然後再呼叫子類的建構函式,結束

時,先呼叫子類的析構函式,再呼叫父類的析構函式。若父類沒有預設的建構函式,子

類建構函式中對父

類成員的初始化必須在初始化列表中實現。

如果子類中有與父類同名的函式或者成員,父類的函式或者成員被隱藏,與函式的參

數,返回值型別都無關。隱藏,父類的函式仍然存在。

舉例:

class b

void show()

private:

int _b;

};class d:public b

void show()

private:

int _b;

int _d;

};int main()

d中有與b同名的成員和函式,所以子類中就會隱藏父類的成員,但是父類的成員依然存

在,b.show()依然可以列印出b中的成員。b的大小是4位元組,d的大小是12位元組。這就是

所謂的隱藏。

多重繼承:

前邊整理的都是都是單繼承,即乙個類從乙個父類派生而來。當乙個子類有多個父類

時,這種繼承方式成為多重繼承。

在多重繼承中,最典型的繼承方式就是菱形繼承。

為了解決菱形繼承中出現的問題,我們引入了虛基類。看下邊的**:

class a

protected:

int _a;

};class b :virtual public a

protected:

int _b;

};class c :virtual public a

protected:

int _c;

};class d :public b, public c

protected:

int _d;

};int main()

要是沒有在b,c的派生列表中加上virtual關鍵字,最終輸出d的大小是20位元組,加上之

後呢就是24位元組。

我們知道,如果是單繼承的話,子類成員在記憶體中的情況就是:先是來自父類的成員,

然後就是來自子類的成員,緊挨儲存。那麼虛繼承的物件模型究竟是什麼,開啟記憶體看

一下:(windows下的情況)linux下的情況之後補充 。

大家也可以開啟記憶體看單繼承和菱形繼承的物件模型,這裡就不給出了。

友元與繼承:

由於友元不可以傳遞,所以友元就不能繼承。父類的友元不可以訪問子類的私有和保

護成員,但是可以訪問子類從父類繼承下來的成員。父類的友元要想訪問子類,必須將

該友元宣告為子類的友元。

class d;

class b

protected:

int _b;

};class d:public b

public:

int _d;

protected:

int _e;

private:

int _f;

};void show(b &b, d &d)

int main()

父類的友元函式並不能訪問子類的私有成員和保護成員。

靜態成員與繼承:

如果父類定義了乙個靜態成員,則在整個繼承體系中都只有該成員的唯一定義,不管

從父類派生出多少子類,對於每個靜態成員來說只存在唯一的例項。並且子類的物件都

能訪問父類的靜態成員。這裡就不給出**了,感興趣的可以自己寫出**。

以上問題如有不合理的地方,希望聯絡[email protected],不勝感激~

c 物件導向之繼承

1 什麼是繼承?繼承簡單來理解就是子承父業,也即是孩子可以直接使用父親的東西,這樣自己就可以少奮鬥一些,父親有的東西可以直接拿過來用。2 程式設計中為什麼要用繼承?在程式設計中,對程式猿來說最想做的就是用盡可能少且高效的 實現想要的功能。就像好多人都不願白手起家一樣,直接繼承父母的財產,使用繼承可以...

C 篇 物件導向之繼承

物件導向有三大特色 多型 繼承和封裝,我們已經熟悉的不能再熟悉了,然而在c 中要怎麼用呢?現在就著重總結一下繼承。在很早之前就聽他們說vb並不是真正的物件導向,它是一種面向過程的設計語言,在學習c 的這些日子裡,逐漸明白了物件導向是怎麼一回事。在以前我們敲 的時候是乙個功能乙個功能的實現,而現在我們...

物件導向之繼承

此段摘自 繼承方式限定了基類成員在派生類中的訪問許可權,包括 public 公有的 private 私有的 和 protected 受保護的 此項是可選的,如果不寫,預設為 private 或 protected。不要將繼承方式和成員屬性搞混了,不同的繼承方式會賦予繼承來的成員不同的屬性 簡單說一下...