單繼承
class base
{
public:
virtual void fun() {}
protected:
int var
};
base內(nèi)存結(jié)構(gòu):
0:vfptr -> base::fun
4:var
class A : public base
{
public:
virtual void fun() {}
virtual void funA() {}
protected:
int varA
};
A內(nèi)存結(jié)構(gòu):
0:vfptr -> A::fun A::funA
4:var
8:varA
多重繼承
class B : public base
{
public:
virtual void fun() {}
virtual void funB() {}
protected:
int varB
};
class C : public A, public B
{
public:
virtual void fun() {}
virtual void funC() {}
protected:
int varC
};
C內(nèi)存結(jié)構(gòu):
0:vfptr -> A::fun A::funA C::funC
4:var
8:varA
12:vfprt -> B::fun B::funB
16:var
20:varB
24:varC
虛擬繼承
class C : virtual public A, virtual public B
{
public:
virtual void fun() {}
virtual void funC() {}
protected:
int varC
};
C內(nèi)存結(jié)構(gòu):
0:vfptr -> A::funA C::funC
4:vbprt -> -4 24
8:varA
12:vfprt -> B::funB
16:vbptr -> -4 12
20:varB
24:varC
28:vfprt -> C::fun
32:var
構(gòu)造函數(shù)
默認(rèn)構(gòu)造函數(shù)唧取,兩種情況维贺,一是參數(shù)為空的構(gòu)造函數(shù)耿战、一個是參數(shù)都有默認(rèn)值的構(gòu)造函數(shù)
構(gòu)造函數(shù)指向順序:虛基類(繼承順序) -> 直接父類(繼承順序) -> 自己類成員構(gòu)造函數(shù)(聲明順序) -> 自己的構(gòu)造函數(shù)
如果無顯示調(diào)用構(gòu)造函數(shù)姨蝴,則調(diào)用默認(rèn)構(gòu)造函數(shù),如果沒有默認(rèn)構(gòu)造函數(shù)策幼,則編譯器創(chuàng)建一個默認(rèn)構(gòu)造函數(shù)邑时。
析構(gòu)函數(shù)
與構(gòu)造函數(shù)相反,虛構(gòu)函數(shù)必須是虛函數(shù)特姐,這樣保證調(diào)用時從繼承類開始執(zhí)行晶丘,如果部署虛函數(shù),有可能只調(diào)用基類析構(gòu)函數(shù)唐含,而沒有析構(gòu)繼承類的
拷貝構(gòu)造函數(shù)
無定義拷貝構(gòu)造函數(shù)浅浮,則按構(gòu)造函數(shù)調(diào)用順序調(diào)用相應(yīng)父類、類成員捷枯、自己的的默認(rèn)拷貝構(gòu)造函數(shù)
有顯示定義拷貝構(gòu)造函數(shù)滚秩,則按構(gòu)造函數(shù)調(diào)用順序調(diào)用相應(yīng)父類、類成員铜靶、自己的的默認(rèn)構(gòu)造函數(shù)(如果有顯示初始父類,則調(diào)用相應(yīng)的構(gòu)造函數(shù),無則調(diào)用默認(rèn)構(gòu)造函數(shù))
賦值操作符號重載
如果有顯示定義賦值操作符號争剿,則不調(diào)用父類的已艰,只執(zhí)行自己的,對于父類部分操作需要專門代碼處理
如果沒有顯示定義賦值操作符號蚕苇,則按構(gòu)造函數(shù)執(zhí)行順序哩掺,先調(diào)用虛基類,直接父類涩笤,及自己的嚼吞。
多重繼承的指針賦值:
C objc;
A pobja=&objc; //
B pobjb=&objc; //編譯器做了調(diào)整
一般指針類型轉(zhuǎn)換,都是不修改指針的值蹬碧,只改變指針的類型(指針指向的內(nèi)存的解釋方式)舱禽,多重繼承下的指針轉(zhuǎn)換會做調(diào)整。
pobja 地址與 objc一致
pobjb 地址與 objc不一致恩沽,差A(yù)長度
assert(pobja == pobjb) 編譯器做調(diào)整