C 物件導向基礎知識詳解一

2021-07-13 12:17:37 字數 3092 閱讀 8869

***********************************====

類: 對某類事物特徵的抽象。 關鍵子: class 。"抽象", 這個專業術語可能有些難以難以理解,個人體會,抽象是乙個過程,

即將某類事物的特徵進行提取, 劃分,歸類,找出一些共同的特徵,將這些共同的特徵進行概念話。總之概括起來就是一句

話,「由具體的事物---->非具體事物的過程叫做抽象"。結合下列例子體會 class中抽象這一特徵。

菠蘿,蘋果,香蕉,桃,西瓜,它們見各有特色,它們也有共同點,它們都是水果,都具有水果的特性,例如可以食用,

富含維生素等。社會各種形形色色的人,各有千秋,但他們都是人。從菠蘿,蘋果,香蕉,桃,西瓜推導出水果的這一

過程叫做抽象。

類本身不占用記憶體空間,但是類物件實實在在占用記憶體空間,那麼類物件是如何在記憶體中儲存的呢?

本人採用的平台ubuntu16.04, x86_64架構, 8g記憶體, linux kernel 4.4, gcc/g++ 5.3, 

(1)沒有虛函式的類物件在記憶體的儲存方式

分析:存在繼承關係時, 子類的記憶體儲存方式是先儲存父類的資料成員變數,在儲存子類本身的資料成員變數。當父類指標指向

子類物件時,父類指標只是指向子類中父類的那片記憶體空間。細心的你會發現,當pstu=&stu, pstu->display();是呼叫父類(student)

中的display()函式,當pstu=&grt, pstu->display();仍然是呼叫父類(student)中的display()函式,但是,pgrt = &grt, pgrt->display()

是呼叫子類(graduate)中的display()函式,這是為什麼呢?

補充: this指標,想必大家都熟悉吧,可你曾想過this指標是什麼東東?this指標是個特殊的指標,它指向本類物件,它的值是當前被

呼叫的成員函式所在的物件的起始位址,作為隱藏的引數傳遞給函式(包括建構函式和析構函式)。

例如: void student::display()經過編譯器處理,void student::display(student* const this)

void graduate::display()經過編譯器處理,void graduate::display(graduate* const this)

所以你才可以在編碼的時候在函式內使用this指標呼叫資料成員,同時正是this指標的存在,才使類的函式**可以重用並且資料

引用無誤。因為每個類物件在呼叫函式時都會把自己的位址作為引數傳入。所以, 當pstu=&grt時,pstu->display()仍然是呼叫父類

中的display()函式,編譯器依據display(student* pstu)只能呼叫父類的display()函式。(虛函式有些特殊,在後面為您詳細講解)

(3)沒有虛函式的類物件多重繼承關係在記憶體的儲存方式

class teacher;

teacher::teacher(int tid, char* tname, char* title)

:_tid(tid)

teacher::~teacher()

void teacher::display()

void teacher::classtype()

class gradute : public student, public teacher;

gradute::gradute(int sid, char* sname, int sage, int score,

int tid, char* tname, char* title,

int salary, char* addr)

:student(sid, sname, sage,score),

teacher(tid, tname,title),

_salary(salary)

gradute::~gradute()

void gradute::display()

分析:  多重繼承時, 子類物件記憶體儲存方式是按照繼承父類的宣告順序進行儲存。

例如class graduate : public student, public teacher; 那麼子類記憶體儲存方式是先儲存父類student的資料成員,再儲存父類

teacher的資料成員,最後儲存子類自身的資料成員。

如果class graduate : public teacher, public student; 那麼子類記憶體儲存方式是先儲存父類teacher的資料成員,再儲存父類

student的資料成員,最後儲存子類自身的資料成員。

這個父類的繼承順序同樣也是子類(graduate)構造函式呼叫父類的構造函式呼叫的順序。

物件導向基礎知識

物件導向三大特性 封裝 繼承 多型 1.多型 多型表示不同的子類可以執行相同的動作,但是要通過它們自己的實現 來執行。為了使子類的例項完全接替來自父類的類成員,父類必須通過virtual關鍵字將該成員宣告為虛擬的,子類可以選擇使用override關鍵字,將父類實現替換為自己的實現,叫方法重寫或覆寫。...

物件導向基礎知識

物件導向 程式分為兩種,一種是面向過程的,另一種是物件導向的。之前的學的都是面向過程的,按部就班的一步一步的按照順序往下走。物件導向 1.什麼叫做物件 一切皆為物件 乙個物件由一組屬性和有權對這些屬性進行操作的一組服務的封裝體 2.什麼叫做類 類是具有相同屬性和服務的一組物件的集合。做類class ...

c 基礎知識 封裝 物件導向

繼承public private和protected跟c 一樣,internal表示同乙個程式集的物件可以訪問 protected internal表示當前程式集 本類和派生類中可以訪問。比如成員變數宣告為 using system namespace declaration.可能不止乙個 name...