1. 程式人生 > 其它 >面向物件特性:封裝、繼承、多型

面向物件特性:封裝、繼承、多型

技術標籤:C++

封裝

封裝就是將想要寫的客觀事物封裝成抽象的類,在類中只可以把自己的資料和方法只讓特定的類(子類或友元類)或者物件操作,對其他的類進行資訊隱藏.
在一個類內部,其中的程式碼或資料可以是私有的,不能被外界訪問。通過這種方式,物件對內部資料提供了不同級別的保護,以防止程式中無關的部分意外的改變或錯誤的使用了物件的私有部分.

繼承

繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。
通過繼承建立的新類稱為“子類”或“派生類”。
被繼承的類稱為“基類”、“父類”或“超類”。。
在C++中,一個子類可以繼承多個基類。但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現。

在考慮使用繼承時,有一點需要注意,那就是兩個類之間的關係應該是“屬於”關係。例如,Student是一個人,Teacher 也是一個人,因此這兩個類都可以繼承 Person 類。

多型

多型是指不同繼承關係的類物件去調同一函式,產生了不同的行為。就是說,子類和父類裡面都有一個名字相同的函式並且其名字、引數和返回值都相同只是函式中的方法不同,這樣我們就能夠通過類名:函式名的方式呼叫不同類中的同名函式
多型實現條件:
(1)在基類中函式宣告為虛擬函式。
(2)在子類中,對基類的虛擬函式進行了重寫。
(3)基類的指標指向了子類的物件。

class A
{
public:
	virtual void f
(); virtual void g(); private: int a; }; class B : public A { public: void g(); private: int b; };

因為A有virtual void f()和g(),所以編譯器為A類準備了一個虛表vtableA,內容如下:
在這裡插入圖片描述

B因為繼承了A,所以編譯器也為B準備了一個虛表vtableB,內容如下:
在這裡插入圖片描述
注意:因為B::g是重寫了的,所以B的虛表的g放的是B::g的入口地址,但是f是從上面的A繼承下來的,所以f的地址是A::f的入口地址。
然後某處有語句 B bB;的時候,編譯器分配空間時,除了A的int a,B的成員int b;以外,還分配了一個虛指標vptr,指向B的虛表vtableB,bB的佈局如下:

在這裡插入圖片描述