假設有乙個簡單類如下:
class test
int getm()
static void print()
};
呼叫如下:
test t(1);
a.getm();
test::print();
c++類實現方式:
struct test ;
// 建構函式
void test_initialize(test* this, int i)
// 普通成員函式中預設傳遞了乙個this指標
int test_getm(test* this)
// 靜態成員函式中無this指標
void test_print()
test t;
test_initialize(&t, 1);
test_getm(&t);
test_print();
c++多型的實現原理:
當類中宣告虛函式時,編譯器會在類中生成乙個虛函式表
虛函式表是乙個儲存類成員函式指標的資料結構
虛函式表示由編譯器自動生成和維護
virtul成員函式會被編譯器放入虛函式表中
存在虛函式時,每個物件中都有乙個只想虛函式表的指標(vptr)
class parent
virtual void func(int n)
};vtable:
void parent::func();
void parent::func(int n);
parent物件:
vptr = &vtable;// 物件初始化完成之後才執行
class child: public parent
virtual void func(int n)
};vtable:
void child::func();
void child::func(int n);
child物件:
vptr = &vtable;// 物件初始化完成之後才執行
呼叫如下:
void run(parent* p)
編譯器確定func是否為虛函式:
否:直接呼叫成員函式(靜態編譯)。
child c;
c.vptr指標分部初始化:
1 當執行父類的建構函式時,c.vptr指向父類的虛函式表;
2 父類的建構函式執行完成後,c.vptr只想子類的虛函式表;
c 類的編譯器實現方式描述
貌似有些同學還不太明白這個,我試著用c 描述c 類相關的一些實現方式。設類abc,bc繼承於a,都有個虛函式f 析構函式為虛 c a struct a a void f printf class a n virtual a struct b public a b virtual void f pri...
實現string類的幾種方式
淺拷貝 淺拷貝的意思就是在拷貝建構函式 賦值運算子函式時並沒有給新物件開闢一塊空間,而是直接二者公用一塊空間。這個問題就很麻煩了。s1,s2共用一塊空間,此時不論s1怎樣修改,都會影響到s2,而且析構s1後,s2就無法繼續使用。簡單 實現如下 class string string string s...
呼叫介面實現類的方式
1.當要呼叫介面的實現類時,有2種方法 1 宣告介面,實現類例項化 2 通過配置檔案的方式,用和兩個標籤,決定使用介面的那個實現類 2.遇到的問題,別人寫好使,我寫不好使 1 使用ssh開發,宣告介面 peforumcommentservice 是介面 private peforumcomments...