本篇主要講面向對象的封裝和繼承特性,另一個特性多態會在後面的文章中講到。
目錄:
面向對象編程過程
封裝的實現
繼承的方式
繼承後對象的構造順序
繼承的種類
一、什麼是面向對象編程(Object Oriented programming,OOP)思想?
在學習C++之前我們一直說面向過程,也就是對於一個需要解決的問題,進行分析,得出每個步驟的實現和實現順序的過程。所以自然而然的就能夠進行面向過程編程,既只需用函數實現這些步驟,然後在使用的時候一個一個進行調用即可。但是爲了實現代碼的可移植性和可擴展性,就有了面向對象。就是把構成問題的事物分解成各個對象,然後描述某一類對象在解決整個問題步驟中的行爲。用一幅圖來描述面向對象編程的過程。
有了面向對象編程技術,因此(程序=算法+數據結構)變爲了(程序=基於對象的算法+以對象爲最小單位的數據結構)
二、封裝:隱藏內部實現。
封裝如何實現?在C++裏邊,封裝和隱藏是通過訪問限定符來實現。
三種訪問限定符:
public:任意位置都能訪問成員變量。
protected:只在類中可以訪問,包括繼承和派生中派生類可以訪問父類的保護成員。
private:只有在自己的類中可以訪問,但是友元關係可以打破。
說到這塊了,順便也說一下struct和class的區別
1、對於class來說定義的變量和函數默認是private,對於struct來說默認是public
2、在struct類中定義該類成員要寫全稱。//struct B{struct B *p;};
3、空結構體:
在windows上:C語言不允許定義空結構體、C++定義空結構體大小爲1個字節。
在Linux上:C語言定義空結構體大小爲0個字節、C++定義空結構體大小爲1個字節。
class定義空結構體爲1個字節。
三、繼承:實代碼複用。
(1)、繼承的方式
有三種訪問限定自然也就有三種繼承關係咯!分別叫做共有繼承、保護繼承、私有繼承。如果不給出繼承關係默認是私有繼承。
寫法如下:
class Base
{
……
};
class derive : Base
{
……
};
在C++中冒號用到兩個地方,分別是繼承和初始化列表中。不同的繼承方式又對成員變量的訪問有什麼影響呢?用一張表總結一下:
基類中變量的訪問限定 | 派生類中繼承過來的訪問限定 | 外部對派生類中成員變量的訪問 | |
共有繼承 | public | public | 能 |
protected | protected | 不能 | |
private | 不可見 | 不能 | |
保護繼承 | public | protected | 不能 |
protected | protected | 不能 | |
private | 不可見 | 不能 | |
私有繼承 | public | private | 不能 |
protected | private | 不能 | |
private | 不可見 | 不能 |
(2)、繼承後對象的構造順序
1、基類構造函數:如果有多個基類,構造函數的調用順序是某類在類派生表中出現的順序,而不是他們在成員初始化列表中出現的順序。
2、成員類對象的構造函數:如果有多個成員類對象,則構造順序是對象在類中被申明的順序,而不是他們出現在成員初始化列表中的順序。
3、派生類構造函數。
(3)、繼承的種類
1、單一繼承
2、多重繼承
3、重複繼承
對於這幾種繼承其中對成員變量的訪問還是結合上面的表格分析即可。