面试宝典之C++虚函数虚继承Word文档格式.docx

上传人:b****5 文档编号:16253943 上传时间:2022-11-22 格式:DOCX 页数:22 大小:17.88KB
下载 相关 举报
面试宝典之C++虚函数虚继承Word文档格式.docx_第1页
第1页 / 共22页
面试宝典之C++虚函数虚继承Word文档格式.docx_第2页
第2页 / 共22页
面试宝典之C++虚函数虚继承Word文档格式.docx_第3页
第3页 / 共22页
面试宝典之C++虚函数虚继承Word文档格式.docx_第4页
第4页 / 共22页
面试宝典之C++虚函数虚继承Word文档格式.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

面试宝典之C++虚函数虚继承Word文档格式.docx

《面试宝典之C++虚函数虚继承Word文档格式.docx》由会员分享,可在线阅读,更多相关《面试宝典之C++虚函数虚继承Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。

面试宝典之C++虚函数虚继承Word文档格式.docx

}

};

1>

classAsize(12):

+---

0|m_pbl

4|m_prt

8|m_prv

1.1单个类

1.1.1单个虚函数

voidvirtualf1()

{

sf1."

2>

classAsize(16):

0|{vfptr}//虚表指针

4|m_pbl

8|m_prt

12|m_prv

+---

A:

:

$vftable@:

//虚表

|&

A_meta

|0

0|&

A:

f1

f1thisadjustor:

0

1.1.2多个虚函数

voidvirtualf2()

sf2."

0|{vfptr}

//同一张表中

|0

1|&

f2

f2thisadjustor:

1.2继承

1.2.1不加函数

classB:

publicA

classBsize(16):

+---

|+---(baseclassA)

0||{vfptr}//同一个指针

4||m_pbl

8||m_prt

12||m_prv

|+---

B:

//B的虚表

|&

B_meta

|0

1.2.2子类override父类的函数

voidf1()

sf1inB."

|+---(baseclassA)

0||{vfptr}

|+---

B_meta//B用来标识类

B:

f1//变成了B的版本

1.2.3子类添加虚函数

voidvirtualf3()

sf3."

0||{vfptr}//合成一个表

2|&

f3//添加到虚表的尾部,类标识为B

f3thisadjustor:

1.2.4多继承

intm_data;

classB

classC:

publicA,publicB

classCsize(12):

0||{vfptr}

4||m_data

|+---(baseclassB)

8||{vfptr}//多个指针

C:

$vftable@A@:

C_meta

$vftable@B@:

|-8

1.3纯虚函数

1.3.1只在父类

voidvirtualf1()=0;

classAsize(8):

4|m_data

子类实现

classBsize(8):

1.3.2父类子类都有

voidvirtualf3()=0;

f3

纯虚函数在内存中布局和一般的虚函数一样。

2.虚继承

2.1虚继承

virtualpublicA

0|{vbptr}//指针

+---(virtualbaseA)

$vbtable@:

//虚继承表

0|0

1|4(Bd(B+0)A)

vbi:

classoffseto.vbptro.vbtefVtorDisp

A4040

2.2两个父类继承自同一个祖父类

2.2.1没有用虚继承

classD:

publicB,publicC

classDsize(8):

||+---(baseclassA)

0|||m_data

||+---

|+---(baseclassC)

4|||m_data//两个m_data

2.2.2加上虚继承之后

classDsize(12):

0||{vbptr}

4||{vbptr}//添加了两个虚继承的指针

+---(virtualbaseA)

8|m_data//只有了一个m_data

D:

$vbtable@B@:

1|8(Dd(B+0)A)

$vbtable@C@:

1|4(Dd(C+0)A)

classoffseto.vbptro.vbtefVtorDisp

A8040

3.虚函数和虚继承结合

3.1一般结合

classBsize(12):

0|{vbptr}//虚继承的指针在前

4|{vfptr}//虚函数的指针在后

8|m_data

|-4

4

3.2子类中有虚函数

classBsize(16):

4|{vbptr}

8|{vfptr}//2个指针

12|m_data

0|-4

1|4(Bd(B+4)A)

A8440

这种情况比较特殊,与不是虚继承的类相比,子类单独添加了一个虚表的指针。

若B对f1重写了,则

sf1intB."

8|{vfptr}

|-8

f1//f1变成了B的版本

8

3.3继承的两个父类继承自同一个祖父类

classDsize(16):

4||{vbptr}//不同类的不同

8|{vfptr}//只有一个

3.4继承的两个父类继承自同一个祖父类并且都有虚函数

publicC,publicB

voidvirtualf4()

sf4."

classDsize(24):

|+---(baseclassC)//虚继承C

4||{vbptr}

|+---(baseclassB)//虚继承B

8||{vfptr}

12||{vbptr}

16|{vfptr}

20|m_data

$vftable@C@:

D_meta

C:

D:

f4//非虚继承则不添加虚表指针,虚函数加到第一个虚表中

1|12(Dd(C+4)A)

1|4(Dd(B+4)A)

|-16

f4thisadjustor:

A16440

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1