51 c 物件模型分析(下)

2021-08-19 20:15:02 字數 2760 閱讀 3563

在c++編譯器的內部類可以理解為結構體,子類是由父類成員疊加子類新成員得到的。

#include

#include

using namespace std;

class demo

};class derived : public demo

void print()

};struct test

;int main()

多型是物件導向理論中的概念,他和具體的程式語言是沒有關係的,也就是說多型指的僅僅是相同的行為方式不同的行為結果,表現出多種形態,在c++中就是由虛函式實現的。相同的行為方式就是指同一條語句不同行為結果就是指得到的結果是不同的。c++是物件導向語言,所以有多型的表現形式,通過虛函式實現。

c++多型的實現原理:當類中宣告虛函式時,編譯器會在類中生成乙個虛函式表,虛函式表是乙個儲存成員函式位址的資料結構。虛函式表是由編譯器自動生成與維護的。virtural成員函式指標會被編譯器放入虛函式表中。存在虛函式時,每個物件中都有乙個指向虛函式表的指標。

class demo

int mi,mj;

public:

return mi+mj+value;

class derived:public demo

int mk;

public:

return mk+value;         

}建立demo物件時,編譯器向此物件放入vptr指標成員變數,指向虛函式表void demo::add(int value)

建立derived物件時,編譯器也放入乙個vptr指標,指向虛函式表void derived::add(int value)

void run(demo *p,int v)

void run(demo* p, int v)

p->add(v);         // p->具體物件(vptr)->虛函式表->函式位址

呼叫效率對比:虛函式《普通成員函式

用c實現多型:

#ifndef _51_2_h_

#define _51_2_h_

typedef void demo;

typedef void derived;

demo* demo_create(int i, int j);

int demo_geti(demo* pthis);

int demo_getj(demo* pthis);

int demo_add(demo* pthis, int value);

void demo_free(demo* pthis);

derived* derived_create(int i, int j, int k);

int derived_getk(derived* pthis);

int derived_add(derived* pthis, int value);

#endif

#include "51-2.h"

#include "malloc.h"

static int demo_virtual_add(demo* pthis, int value);

static int derived_virtual_add(demo* pthis, int value);

struct vtable     // 2. 定義虛函式表資料結構

;struct classdemo

;struct classderived

;static struct vtable g_demo_vtbl = 

;static struct vtable g_derived_vtbl = 

;demo* demo_create(int i, int j)

return ret;

}int demo_geti(demo* pthis)

int demo_getj(demo* pthis)

// 6. 定義虛函式表中指標所指向的具體函式

static int demo_virtual_add(demo* pthis, int value)

// 5. 分析具體的虛函式!!!!

int demo_add(demo* pthis, int value)

void demo_free(demo* pthis)

derived* derived_create(int i, int j, int k)

return ret;

}int derived_getk(derived* pthis)

static int derived_virtual_add(demo* pthis, int value)

int derived_add(derived* pthis, int value)

int main()

{demo* pb = demo_create(1, 2);

derived* pd = derived_create(1, 22, 333);    

printf("pb->add(3) = %d\n", demo_add(pb, 3));

printf("pd->add(3) = %d\n", derived_add(pd, 3));   

run(pb, 3);

run(pd, 3);   

demo_free(pb);

demo_free(pd);    

return 0;

繼承的本質就是父子間成員變數的疊加。

c++中的多型是通過虛函式表實現的。虛函式表是由編譯器自動生成與維護的,虛函式的呼叫效率低於普通成員函式。

5 1 C 陣列的概念

概括地說 陣列是有序資料的集合。要尋找乙個陣列中的某乙個元素必須給出兩個要素,即陣列名和下標。陣列名和下標惟一地標識乙個陣列中的乙個元素。陣列是有型別屬性的。同一陣列中的每乙個元素都必須屬於同一資料型別。乙個陣列在記憶體中佔一片連續的儲存單元。如果有乙個整型陣列a,假設陣列的起始位址為2000,則該...

51 C 副作用和順序點

下面更詳細地介紹c 就遞增運算子何時生效的哪些方面做了規定,哪些方面沒有規定。首先,指的是在計算表示式時對某些東西 如儲存在變數中的值 進行了修改 順序點是程式執行過程中的乙個點,在這裡,進入下一步之前將確保對所有的 都進行了評估。在c 中,語句中的分號就是乙個順序點,這意味著程式處理下一條語句之前...

c 物件模型分析

class是一種特殊的struct 在記憶體中class依舊可以看作變數的集合 class與struct遵循相同的記憶體對齊規則 class中的成員函式與成員變數是分開存放的 每個物件有獨立的成員變數 所有物件共享類中的成員函式 執行時的物件退化為結構體的形式 所有成員變數在記憶體中依次排布 成員變...