物件導向三大機制包括:
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。不要將繼承方式和成員屬性搞混了,不同的繼承方式會賦予繼承來的成員不同的屬性 簡單說一下...